这里写目录标题
15.4 线程的中断
本节主要讨论一个问题,如何在Java中取消或关闭一个线程?我们 先介绍都有哪些场景需要取消/关闭线程,再介绍取消/关闭的机制,以 及线程对中断的反应,最后讨论如何正确地取消/关闭线程。
15.4.1 取消/关闭的场景
我们知道,通过线程的start方法启动一个线程后,线程开始执行run 方法,run方法运行结束后线程退出,那为什么还需要结束一个线程 呢?有多种情况,比如:
1)很多线程的运行模式是死循环,比如在生产者/消费者模式中, 消费者主体就是一个死循环,它不停地从队列中接受任务,执行任务, 在停止程序时,我们需要一种“优雅”的方法以关闭该线程。
2)在一些图形用户界面程序中,线程是用户启动的,完成一些任 务,比如从远程服务器上下载一个文件,在下载过程中,用户可能会希望取消该任务。
3)在一些场景中,比如从第三方服务器查询一个结果,我们希望 在限定的时间内得到结果,如果得不到,我们会希望取消该任务。
4)有时,我们会启动多个线程做同一件事,比如类似抢火车票, 我们可能会让多个好友帮忙从多个渠道买火车票,只要有一个渠道买到 了,我们会通知取消其他渠道。
15.4.2 取消/关闭的机制
Java的Thread类定义了如下方法:
这个方法看上去就可以停止线程,但这个方法被标记为了过时,简 单地说,我们不应该使用它,可以忽略它。
在Java中,停止一个线程的主要机制是中断,中断并不是强迫终止 一个线程,它是一种协作机制,是给线程传递一个取消信号,但是由线程来决定如何以及何时退出。 本节我们主要就是来理解Java的中断机制。
Thread类定义了如下关于中断的方法: