java - 中断 future 如何与单线程执行器一起工作?

标签 java multithreading future executor

如果我经常安排要运行的任务,而这些任务被 future.cancel(true); 取消,那么 Executor.newSingleThreadExecutor() 会如何表现?

执行器生成的单线程是否会被中断(因此 future 代码需要清除中断),或者中断标志是否会在下次 future 启动时自动清除。

执行器是否需要在每个中断上生成一个额外的线程以供剩余的任务队列使用?

有更好的方法吗?

最佳答案

好问题,我没有在任何地方找到这个记录,所以我想说它依赖于实现。

例如,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 - 中断 future 如何与单线程执行器一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46243286/

相关文章:

python - 如何在单个 PyQt GUI 实例中多处理多个绘图

java - 第二个线程没有输出消息

java - 更改类之间的 JLabels

java - dropwizard.metrics :metrics-core latest release 中 JmxReporter 的替代品

java - 来自 LibGDX 中 texturepacker 的纹理

python线程队列生产者消费者线程安全

Java Future<T>、TimeoutException 和获取部分结果

Scala:列表[Future]到Future[List],忽略失败的 future

rust - 为什么 !Send 在 .await 之前被 drop() 丢弃的值意味着 Future 是 !Send?

java - Android 颜色通知图标