第7章 取消与关闭
文章目录
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的关闭