中断执行程序线程池中的可运行
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 你的阻塞资源
假设我在 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 你的阻塞资源