Bootstrap

并发编程学习总结(三) : 线程的中断详解

如果你使用过杀毒软件,可能会发现全盘杀毒太耗时间了,这时你如果点击取消杀毒按钮,那么此时你正在中断一个运行的线程。

java为我们提供了一种调用interrupt()方法来请求终止线程的方法,下面我们就一起来学习一下线程的中断。


每一个线程都有一个boolean类型标志,用来表明当前线程是否请求中断,当一个线程调用interrupt() 方法时,线程的中断标志将被设置为true。

我们可以通过调用Thread.currentThread().isInterrupted()或者Thread.interrupted()来检测线程的中断标志是否被置位。这两个方法的区别是

Thread.currentThread().isInterrupted()是线程对象的方法,调用它后不清除线程中断标志位;而Thread.interrupted()是一个静态方法,调用它会清除

线程中断标志位。


Thread.currentThread().isInterrupted():        对象方法        不清除中断标志位

Thread.interrupted():                                        静态方法         清除中断标志位(设置为false)


所以说调用线程的interrupt() 方法不会中断一个正在运行的线程,这个机制只是设置了一个线程中断标志位,如果在程序中你不检测线程中断标志位,那么即使

设置了中断标志位为true,线程也一样照常运行。


一般来说中断线程分为三种情况:

(一) :中断非阻塞线程

(二):中断阻塞线程

(三):不可中断线程


(一) :中断非阻塞线程

中断非阻塞线程通常有两种方式:

(1)采用线程共享变量

这种方式比较简单可行,需要注意的一点是共享变量必须设置为volatile,这样才能保证修改后其他线程立即可见。

public class InterruptThreadTest extends Thread{

	// 设置线程共享变量
	volatile bo
;