线程八:中断

当程序的线程在运行过程中时需要停止它,这个时候就需要使用到线程的"中断"功能了。理解"中断"在线程开发中的应用是十分重要的,因为它涉及到线程的运行状态调整,在后续的开发中会频繁使用"中断"来控制线程的执行过程。

在线程的执行过程中我们不能强制的关闭掉一个正在执行的线程,因为这样的操作是十分危险的,线程可能在没有正确释放持有锁的情况下被关闭,所以线程中的stop和suspend方法已经不推荐使用了。但是我们确实在某些情况下需要停止某个线程的执行,这个时候我们就需要使用"中断"了。

Java线程的"中断"由三个方法组成,分别是interrupt、interrupted、isInterrupted。其中interrupt是唯一设置线程"中断"的方法,这里需要强调的是如果在调用interrupt方法时,线程正在由于调用了sleep或者join方法而阻塞时,系统会抛出InterruptedException异常并同时清除线程的中断状态。interrupted方法和isInterrupted方法的返回值都是表示当前线程的中断状态,不同的是interrupted方法会清除掉该线程的中断状态。

为了了解中断的使用,我们看一个实例:

线程八:中断

例子中启动了一个线程,在sleep方法调用结束后,在线程上调用了interrupt方法,此时线程的中断状态发生了变化。这个例子中描述的是单个线程的中断操作,下面我们看一个多个线程同时运行的中断例子:

线程八:中断

线程八:中断

例子中创建了两个线程对象tha和thb,并在sleep方法调用之后分别调用了它们的interrupt方法。通过这个实验我们能看到线程中断后,通过判断当前的中断状态进行下一步动作。

中断一个重要的特征是它本身并不会去停止线程的执行,只是设置了线程的中断状态,至于该怎么做由线程自己去决定,大家通常把这种方式称为"优雅"的通知线程而不是武断的为线程做出决定。

线程如果中断正在调用join方法或sleep方法而阻塞的线程时,系统会抛出InterruptedException异常。

参考链接