如果我经常计划运行要被Executor.newSingleThreadExecutor()
取消的任务,future.cancel(true);
的行为如何?
执行程序产生的单线程是否被中断(因此将来的代码需要清除中断),或者在下一个将来启动时自动清除中断标志。
执行程序是否需要在每个中断上产生一个额外的线程,以供剩余的任务队列使用?
有没有更好的办法?
最佳答案
很好的问题,我在任何地方都找不到此文档,因此我想说它与实现有关。
例如,OpenJDK会在执行每个任务之前重置中断标志:
// If pool is stopping, ensure thread is interrupted;
// if not, ensure thread is not interrupted. This
// requires a recheck in second case to deal with
// shutdownNow race while clearing interrupt
if ((runStateAtLeast(ctl.get(), STOP) ||
(Thread.interrupted() &&
runStateAtLeast(ctl.get(), STOP))) &&
!wt.isInterrupted())
wt.interrupt();
来自OpenJDK jdk8u ThreadPoolExecutor#runWorker source的摘录。
关于java - 单线程执行程序如何中断将来的工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46243286/