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

时间:2018-10-08 09:54:00

标签: java executorservice threadpoolexecutor

假设我在Java中使用executor框架启动了10个线程。我想稍后根据某些条件停止/中断可调用对象。这样做的最好方法是什么。我了解future.cancel(true),无法解决问题。

1 个答案:

答案 0 :(得分:0)

选中此article.

调用shutdownNow()或cancel()不会停止正在进行的可运行对象。这些方法所做的只是在相应线程上调用.interrupt()。问题是,您的runnable无法处理InterruptedException(并且无法处理)。这是许多书籍和文章中描述的一个非常普遍的问题,但仍然有点违反直觉。

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

  • 可扩展运行
  • 使“可取消”的资源(例如输入 流)实例字段,它为您提供了一个cancel方法 扩展的可运行的,您可以获得“可取消的”资源,并且 取消它(例如调用inputStream.close())
  • 实施自定义 依次创建自定义Thread实例的ThreadFactory 重写interrupt()方法并在以下位置调用cancel()方法 您扩展的Runnable
  • 使用自定义实例化执行器 线程工厂(静态工厂方法将其作为参数)
  • 句柄 在run()方法中突然关闭/停止/断开阻塞资源