使用Java和App Server我部署具有線程執行器的應用程序。爲什麼線程執行程序本身在關閉後仍在內存中?
在部署過程中,我請求執行器關閉。這成功取消了所有的任務。然而,通過VisualVM,我仍然可以看到一個表示執行器本身的線程,它處於等待狀態。在整個應用程序取消部署時,我不保留對執行器的任何引用。所以如果我多次重複部署 - 非部署週期,我可以看到線程數量如何增長。
我該如何擺脫它們?
UPDATE:
代碼示例
這裏是代碼:
public void startScheduler()
{
if (scheduledExecutor == null)
{
scheduledExecutor = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("My ScheduledExecutor"));
processFuture = scheduledExecutor.scheduleAtFixedRate(new Runnable()
{
@Override
public void run()
{
startProcessor();
}
}, 0, 84600, TimeUnit.SECONDS);
}
}
public void stopScheduler()
{
if (processFuture != null)
{
processFuture.cancel(true);
processFuture = null;
}
if (scheduledExecutor != null)
{
try
{
scheduledExecutor.shutdownNow();
scheduledExecutor.awaitTermination(10, TimeUnit.SECONDS);
}
catch (InterruptedException ignored)
{}
finally
{
scheduledExecutor = null;
}
}
}
您使用的具體Executor類是什麼?你打的什麼確切的關機方法? – richs
Executors.newSingleThreadScheduledExecutor和shutdownNow() – user567068
這段代碼是正確的。如果執行者被關閉,那麼問題在於別處。 – jtahlborn