中断执行程序线程池中的可运行

Interrupting a runnable in executor threadpool

假设我在 java 中使用执行器框架启动了 10 个线程。我想 stop/interrupt 稍后基于特定条件的可调用对象。最好的方法是什么。我理解 future.cancel(true),没有解决问题。

勾选这个article.

调用 shutdownNow() 或 cancel() 不会停止正在进行的 运行nable。这些方法所做的只是在各自的线程上调用 .interrupt() 。问题是,您的 运行nable 不处理 InterruptedException(它不能)。这是多本书和文章中描述的一个非常普遍的问题,但它仍然有点违反直觉。

为此,您需要做很多事情。

  • 扩展 Runnable
  • 制作“可取消”资源(例如输入 stream) 一个实例字段,它为您的 extended 运行nable,在这里你可以获得“可取消”资源和 取消它(例如调用 inputStream.close())
  • 实现自定义 ThreadFactory 依次创建自定义 Thread 实例 覆盖 interrupt() 方法并调用 cancel() 方法 你的扩展 Runnable
  • 用自定义实例化执行器 线程工厂(静态工厂方法将其作为参数)
  • 句柄 在 运行() 方法
  • 中突然 closing/stopping/disconnecting 你的阻塞资源