From 4a0f00a782f2d6e6e516ab05a813457eaf7cbcd6 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Tue, 27 Jul 2010 21:48:47 +0400 Subject: [PATCH] Rollback... Need to ensure to requests from the same alarm can execute simultaneously due to use of shared thread pool in application. --- .../platform-api/src/com/intellij/util/Alarm.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/platform/platform-api/src/com/intellij/util/Alarm.java b/platform/platform-api/src/com/intellij/util/Alarm.java index 9f4b1f78ddb6..4aafb948aa95 100644 --- a/platform/platform-api/src/com/intellij/util/Alarm.java +++ b/platform/platform-api/src/com/intellij/util/Alarm.java @@ -43,6 +43,8 @@ public class Alarm implements Disposable { private final List myRequests = new ArrayList(); private final List myPendingRequests = new ArrayList(); + private final ThreadPoolExecutor myExecutorService; + private static final ThreadPoolExecutor ourSharedExecutorService = ConcurrencyUtil.newSingleThreadExecutor("Alarm pool(shared)", Thread.NORM_PRIORITY - 2); private final Object LOCK = new Object(); @@ -53,6 +55,10 @@ public class Alarm implements Disposable { public void dispose() { myDisposed = true; cancelAllRequests(); + if (myThreadToUse == ThreadToUse.OWN_THREAD) { + myExecutorService.getQueue().clear(); + myExecutorService.shutdown(); + } } public enum ThreadToUse { @@ -78,6 +84,7 @@ public class Alarm implements Disposable { } public Alarm(@NotNull ThreadToUse threadToUse, Disposable parentDisposable) { myThreadToUse = threadToUse; + myExecutorService = threadToUse == ThreadToUse.OWN_THREAD ? ConcurrencyUtil.newSingleThreadExecutor("Alarm pool(own)", Thread.NORM_PRIORITY - 2) : ourSharedExecutorService; if (parentDisposable != null) { Disposer.register(parentDisposable, this); @@ -236,9 +243,7 @@ public class Alarm implements Disposable { } } else { - myFuture = (myThreadToUse == ThreadToUse.SHARED_THREAD) - ? ourSharedExecutorService.submit(scheduledTask) - : ApplicationManager.getApplication().executeOnPooledThread(scheduledTask); + myFuture = myExecutorService.submit(scheduledTask); } } }