【发布时间】:2019-05-07 17:13:10
【问题描述】:
我正在创建一个具有 10 个线程的固定大小的线程池,如下所示:
ExecutorService executorService = Executors.newFixedThreadPool(10);
for (int i = 0; i < poolSize; ++i) {
executorService.execute(factory.get());
}
现在,在产生 10 个线程之后,每个线程都在执行一个可运行的对象。这里的Runnable由factory.get()提供
现在,我想做一件事,即一旦线程关闭,即它完成了一项任务,它就会再次选择另一个可运行对象并开始运行它。因此,基本上检查所有 10 个线程的状态并在线程关闭时再次执行可运行。
我知道我可以做类似的事情,其中我可以调用 executorService shutdown() 方法来做到这一点:
while (!executorService.isShutdown()) {
try {
executorService.execute(factory.get());
} catch (RejectedExecutionException e) {
if (!executorService.isShutdown())
log.warn("task submission rejected");
}
}
但是在这种方法中,问题是我一直在调用执行函数,这会增加 LinkedBlockingQueue 并且不会达到我的目的。
如果我能以某种方式检查 Threads 状态,那就太好了,因为这样可以避免返回从 executor 服务获取更多工作的开销。
请建议我如何在代码中做到这一点。
【问题讨论】:
-
几个建议:1)你可以把它翻转过来,减少线程的状态,而更多地关注 Runnable 的状态:你的 Runnable 派生类型中有什么可以订阅或要求在工作完成时通知您? 2)考虑使用Callable而不是Runnable;这样你就可以询问返回的 Future
isDone()以确定任务是否完成。 -
would increase LinkedBlockingQueue and won't serve my purpose你想达到什么目的?如果您在将任务提交给执行程序之前就阻塞了,那么您并没有真正正确地利用线程池。队列缓冲任务有什么问题? -
完成任务不应该关闭线程,这违背了拥有线程池的目的。不清楚你想要完成什么,但我怀疑你应该让执行者做它的事情而不是微观管理它。
标签: java multithreading