2)中断
中断通常是实现取消最明智的选择,但线程自身需要支持中断处理,并且要处理好中断策略,一般响应中断的方式有两种:
● 处理完中断清理后继续传递中断异常(InterruptedException)
● 调用interrupt方法,使得上层能感知到中断异常
3) 取消不可中断阻塞
存在一些不可中断的阻塞,比如:
● java.io和java.nio中同步读写IO
● Selector的异步IO
● 获取锁
对于这些线程的取消,则需要特定情况特定对待,比如对于socket阻塞,如果要安全取消,则需要调用socket.close()
4)JVM的关闭
如果有任务需要在JVM关闭之前做一些清理工作,而不是被JVM强硬关闭掉,可以使用JVM的钩子技术,其实JVM钩子也只是个很普通的技术,也就是用个map把一些需要JVM关闭前启动的任务保存下来,在JVM关闭过程中的某个环节来并发启动这些任务线程。具体使用示例如下:
|
相关链接: