1

我是新来java执行器的东西。Java ServiceExecutor终止条件

我正在使用Java的ExecutorService来启动几个线程来处理数据。

Executor executor = Executors.newFixedThreadPool(poolSize); 

for(int i=0; i< 5;i++) executor.execute(new MyRunnable(i)); 

一旦线程没有找到数据,他们正常终止。

我的问题是当所有线程终止时执行程序会发生什么情况,它仍在运行其主线程?或者它会自行终止,整个应用程序将优雅地完成?

如果执行程序线程仍在运行,我怎么能让它在它的所有子线程完成后终止(poolSize线程数)。

回答

2

Executor将继续在卧螺纹池下运行。您仍然可以执行或提交新任务。建议关闭Executor服务调用ExecutorService.html#shutdown(),它会尝试停止所有正在执行的任务,暂停等待任务的处理,并返回正在等待执行的任务的列表。

您也可以使用ExecutorService.html#shutdownNow(),它停止所有正在执行的任务,暂停等待任务的处理并返回正在等待执行的任务的列表。当您需要立即关闭时,它非常有用。

+0

感谢Quoi无主线程。无论如何,我可以从MyRunnable线程类发送一些信号,说让shutdownNow()执行器服务? – 2013-03-02 07:47:22

1

使用shutdown方法从接口ExecuterService正常关闭,因为即使线程完成,Quoi仍然运行它。您可以随时使用提交进行新工作。其他实用的方法是here

1

你能想到这样的说法:

shutdown()只会让执行者服务,它不能接受新的任务,但已经提交的任务继续运行

shutdownNow()将执行相同的操作,并尝试通过中断相关的线程来取消已提交的任务。请注意,如果您的任务忽略中断,则shutdownNow的行为将与关机完全相同。

2

1)在一个固定的线程池执行线程永远无法终止一旦开始

2)存在线程池执行

+0

好的。无论如何,一旦所有的工作线程完成处理,停止池? – 2013-03-02 07:42:49

+1

executor.shutdown()否则你的应用永远不会结束 – 2013-03-02 08:02:06

+0

同意。这意味着我需要将执行程序对象传递给MyRunnable,然后从那里关闭。希望这应该是正确的地方。 – 2013-03-02 08:39:18