diff --git a/java/compiler/impl/src/com/intellij/compiler/CompilerManagerImpl.java b/java/compiler/impl/src/com/intellij/compiler/CompilerManagerImpl.java index df9bd71ed834..ba4b8010977a 100644 --- a/java/compiler/impl/src/com/intellij/compiler/CompilerManagerImpl.java +++ b/java/compiler/impl/src/com/intellij/compiler/CompilerManagerImpl.java @@ -53,7 +53,6 @@ import java.util.concurrent.TimeUnit; public class CompilerManagerImpl extends CompilerManager { private static final Logger LOG = Logger.getInstance("#com.intellij.compiler.CompilerManagerImpl"); - private static final int IDLE_PROCESSES_CHECK_PERIOD = 10000; // check idle javac processes every 10 second when IDE is idle private final Project myProject; @@ -468,21 +467,7 @@ public class CompilerManagerImpl extends CompilerManager { ); manager.start(listenPort); myExternalJavacManager = manager; - IdeEventQueue.getInstance().addIdleListener(new Runnable() { - @Override - public void run() { - final ExternalJavacManager manager; - synchronized (CompilerManagerImpl.this) { - manager = myExternalJavacManager; - } - if (manager != null) { - manager.shutdownIdleProcesses(); - } - else { - IdeEventQueue.getInstance().removeIdleListener(this); - } - } - }, IDLE_PROCESSES_CHECK_PERIOD); + IdeEventQueue.getInstance().addIdleListener(new IdleTask(manager), IdleTask.CHECK_PERIOD); } } } @@ -600,4 +585,22 @@ public class CompilerManagerImpl extends CompilerManager { } } + private static class IdleTask implements Runnable { + private static final int CHECK_PERIOD = 10000; // check idle javac processes every 10 second when IDE is idle + private final ExternalJavacManager myManager; + + IdleTask(@NotNull ExternalJavacManager manager) { + myManager = manager; + } + + @Override + public void run() { + if (myManager.isRunning()) { + myManager.shutdownIdleProcesses(); + } + else { + IdeEventQueue.getInstance().removeIdleListener(this); + } + } + } } \ No newline at end of file diff --git a/jps/jps-builders/src/org/jetbrains/jps/javac/ExternalJavacManager.java b/jps/jps-builders/src/org/jetbrains/jps/javac/ExternalJavacManager.java index 2b6d9ba06ced..a6626638b85c 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/javac/ExternalJavacManager.java +++ b/jps/jps-builders/src/org/jetbrains/jps/javac/ExternalJavacManager.java @@ -239,6 +239,10 @@ public class ExternalJavacManager extends ProcessAdapter { return p >= 0 && p < options.size() - 1 ? options.get(p + 1) : null; } + public boolean isRunning() { + return !myChannelRegistrar.isEmpty(); + } + public void stop() { synchronized (myConnections) { for (Map.Entry entry : myConnections.entrySet()) { @@ -247,7 +251,13 @@ public class ExternalJavacManager extends ProcessAdapter { } myChannelRegistrar.close().awaitUninterruptibly(); if (myOwnExecutor && myExecutor instanceof ExecutorService) { - ((ExecutorService)myExecutor).shutdown(); + final ExecutorService service = (ExecutorService)myExecutor; + service.shutdown(); + try { + service.awaitTermination(15, TimeUnit.SECONDS); + } + catch (InterruptedException ignored) { + } } }