使用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