《Java并发编程实践——第七章(取消和关闭)》

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011067966/article/details/84112511

取消和关闭

中断——一种协作机制,使线程能够要求另一个线程停止当前工作。

7.1 任务取消

当外部代码能够在活动自然完成之前,把它改为完成状态,那个这个活动被称为可取消的。

7.1.1 中断

在这里插入图片描述
线程中断方法:
在这里插入图片描述

中断并不会真正中断一个正在运行的线程,它仅仅发出中断请求,线程自己会在下一个方便的时刻中断。

中断是实现取消的最好选择。

7.1.2 中断策略

在这里插入图片描述

7.1.3 响应策略

在这里插入图片描述

7.1.5 通过Future取消

在这里插入图片描述

7.1.6 处理不可中断阻塞

对于不可中断阻塞,可以采取与中断类似手段,来确保可以停止这些线程。

7.1.7用newTaskFor 封装非标准取消

7.2 停止基于线程的服务

在这里插入图片描述

7.2.1 示例:日志服务

日志被分离到单独的线程,构成生产者——消费者模式。
在这里插入图片描述

7.2.2 关闭ExecutorService

在这里插入图片描述

7.2.3 致命药丸

另一种关闭生产者——消费者服务的方式是致命药丸。
致命药丸:一个可识别的对象,置于队列中,当你得到它,就意味着停止工作。

7.2.4 只执行一次的服务

在这里插入图片描述

使用私有Executor:
在这里插入图片描述

7.2.3 shutdownNow的局限性

在这里插入图片描述

7.3 处理反常的线程终止

在这里插入图片描述

7.3.1 未捕获异常的处理

在这里插入图片描述
未捕获的异常写入日志:
在这里插入图片描述

7.4 JVM关闭

JVM可以正常地关闭,也可以强行关闭。

7.4.1 关闭钩子

在这里插入图片描述

7.4.2 精灵线程

在这里插入图片描述

7.4.3 Finalizer

在这里插入图片描述

避免使用Finalizer。

猜你喜欢

转载自blog.csdn.net/u011067966/article/details/84112511