【发布时间】:2014-06-23 22:37:59
【问题描述】:
这个问题和我之前的问题有关:Why the speed of a Java process inside multiple loops slows down as it goes?
为了找到那个问题的问题,我仔细查看了我的代码,发现我的应用程序中的一些执行器没有被终止,因为我正在学习如何使用执行器,所以我复制了一些在线示例代码并在我的应用程序中使用它们,我不确定我是否正确使用它们。
以下两种使用执行器的方法有什么区别?
[1]
Executor executor=Executors.newFixedThreadPool(30);
CountDownLatch doneSignal=new CountDownLatch(280);
for (int N=0;N<280;N++)
{
...
executor.execute(new SampleCountRunner(doneSignal,...));
}
try { doneSignal.await(); }
catch (Exception e) { e.printStackTrace(); }
[2]
ExecutorService executor=Executors.newFixedThreadPool(30);
for (int i=0;i<60;i++)
{
...
executor.execute(new xyzRunner(...));
}
executor.shutdown();
while (!executor.isTerminated()) { }
在我看来,在第一个完成后,执行程序仍然有一个活动线程池正在运行并等待更多任务,它们确实会消耗 cpu 时间和内存。
第二个将在shutdown()方法运行后终止池中的所有活动线程,并且在此之后所有以前活动的线程将不再占用cpu时间或内存。
所以我的问题是:
[1] 我说的对吗?
[2] 第一种情况如何终止线程池? Executor 没有“executor.shutdown()”
编辑:
问题解决了,我将[1]中的Executor改为ExecutorService,并补充:
executor.shutdown();
while (!executor.isTerminated()) { }
现在当我的程序结束时,它不会再有很多活动线程了。
【问题讨论】:
标签: java executorservice executor