2

我是 java executor 的新手。

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

Executor executor = Executors.newFixedThreadPool(poolSize);

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

一旦线程找不到数据,它们就会优雅地终止。

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

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

4

4 回答 4

3

1) 固定线程池执行器中的线程一旦启动就永远不会终止

2)线程池执行器中没有主线程

于 2013-03-02T07:37:41.037 回答
2

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

您还可以使用ExecutorService.html#shutdownNow()which 停止所有主动执行的任务,停止等待任务的处理,并返回等待执行的任务列表。当您需要立即关闭时,它很有用。

于 2013-03-02T07:29:12.520 回答
2

你可以这样想:

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

shutdownNow()会做同样的事情并且会尝试通过中断相关线程来取消已经提交的任务。请注意,如果您的任务忽略中断,shutdownNow则其行为方式与关闭完全相同。

于 2013-03-02T07:33:46.617 回答
1

使用 shutdown 方法从接口 ExecuterService 正常关闭,正如 Quoi 建议的那样,即使线程完成,它仍然会运行。之后,您可以随时使用提交进行新工作。其他实用方法在这里

于 2013-03-02T07:33:03.453 回答