【发布时间】:2012-09-17 17:29:57
【问题描述】:
是否有ExecutorService 允许现有线程执行执行而不是产生新线程?如果它是 ScheduledExecutor 则奖励。大多数执行器会产生工作线程来执行,但我希望工作线程是我所在的现有线程。这是我想象的 API:
while (!executor.isTerminated()) {
Runnable r = executor.take();
r.run();
}
这类似于 SWT 和 JavaFX 允许主线程分派事件的方式,与 Swing 不同,后者需要产生自己的事件分派线程来处理事件。
动机:我目前有很多地方线程产生一个新的执行程序,然后调用 awaitTermination() 等待它完成。我想节省一些资源并防止堆栈跟踪被一分为二。
请注意,我不想要在 execute(Runnable) 的调用者线程中运行任务的执行程序,这是 this answer 和 Guava 的 MoreExecutors.sameThreadExecutor() 所做的。
【问题讨论】:
-
take()如何表明假设的Executor#isTerminated()谓词的答案在您看到它返回 true 后变为 false? -
@seh 推测,
isTerminated读取了一些volatile变量,可以由另一个线程更改,要求它终止。毕竟这是一个关于并发的问题:3 -
那个实现细节并没有解决我的设计问题。由于依赖 check-then-act 协议,循环被削弱了。
(SomeKindOf)Executor#isTerminated()表示的真相可以在调用(SomeKindOf)Executor#take()之前改变。那么take()是返回null,还是抛出InterruptedException?它需要一个比Runnable更宽的共同域来表明它是在执行程序终止后调用的。 -
@seh 终止与关机不同。看
ExecutorService。有两个值:shutdown(控制是否接受任务)和终止(如果还有作业要执行,则返回true。所以是的,一旦作业队列为空,关闭进程将中断其所有线程线程池和take会抛出InterruptedException。添加isTerminated 检查将允许线程正常终止而不依赖异常。
标签: java concurrency executorservice