7.1 任务取消

  • 用户请求取消
  • 有时间限制的操作
  • 应用程序事件
  • 错误
  • 关闭

7.1.1 中断

调用interrupt并不意味着立即停止目标线程正在进行的工作,而只是传递了请求中断的消息

通常,中断是实现取消的最合理方式

7.1.2 中断策略

由于每个线程拥有各自的中断策略,因此除非你知道中断对该线程的含义,否则就不应该中断这个线程

7.1.3 响应中断

只有实现了线程中断策略的代码才可以屏蔽中断请求,在常规的任务和库代码中都不应该屏蔽中断请求

7.1.5 通过Future来实现取消

当Future.get抛出InterruptedException或TimeoutException时,如果你知道不再需要结果,那么就可以调用Future.cancel来取消任务

7.1.6 处理不可中断的阻塞

线程阻塞的原因

  • Java.io包中的同步Socket I/O。
  • Java.io包中的同步I/O
  • Selector的异步I/O
  • 获取某个锁

7.1.7 采用newTaskFor来封装非标准的取消

7.2 停止基于线程的服务

对于持有线程的服务,只要服务的存在时间大于创建线程的方法的存在时间,那么就应该提供生命周期方法

7.2.2 关闭ExecutorService

7.2.3 毒丸对象

毒丸是指一个放在队列上的对象,其含义是:当得到这个对象时,立即停止

7.2.5 shutdownNow的局限性

使用TrackingExecutorService来保存未完成的任务以备后续执行

7.3 处理非正常的线程终止

7.4 JVM关闭

7.4.1 关闭钩子

通过Runtime.addShutdownHook注册的但尚未开始的线程

7.4.2 守护线程

创建一个线程来执行一些辅助工作,但又不希望这个线程阻碍JVM的关闭

7.4.3 终结器