如何中断一个线程?

1. while循环判断interrupt标识

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
Thread t1 = new Thread(() -> {
while (true)
{
if(Thread.currentThread().isInterrupted())
{

System.out.println(Thread.currentThread().getName()+"\t isInterrupted()被修改为true,程序停止");
System.out.println(Thread.currentThread().isInterrupted());
break;
}
System.out.println("t1 -----hello interrupt api");
}
}, "t1");
t1.start();

System.out.println("-----t1的默认中断标志位:"+t1.isInterrupted());

//暂停毫秒
try { TimeUnit.MILLISECONDS.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); }

//t2向t1发出协商,将t1的中断标志位设为true希望t1停下来
new Thread(() -> {
t1.interrupt();
},"t2").start();
//t1.interrupt();

}

2. 使用AtomicBoolean类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
new Thread(() -> {
while (true)
{
if(atomicBoolean.get())
{
System.out.println(Thread.currentThread().getName()+"\t atomicBoolean被修改为true,程序停止");
break;
}
System.out.println("t1 -----hello atomicBoolean");
}
},"t1").start();

//暂停毫秒
try { TimeUnit.MILLISECONDS.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); }

new Thread(() -> {
atomicBoolean.set(true);
},"t2").start();
}

3. 使用volatile修饰的布尔变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
new Thread(() -> {
while (true)
{
if(isStop)
{
System.out.println(Thread.currentThread().getName()+"\t isStop被修改为true,程序停止");
break;
}
System.out.println("t1 -----hello volatile");
}
},"t1").start();

//暂停毫秒
try { TimeUnit.MILLISECONDS.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); }

new Thread(() -> {
isStop = true;
},"t2").start();
}

处于不同状态线程被中断后的反应

1. 活动状态 VS 非活动状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
//实例方法interrupt()仅仅是设置线程的中断状态位设置为true,不会停止线程
Thread t1 = new Thread(() -> {
for (int i = 1; i <=3000; i++)
{
System.out.println("-----: "+i);
}
System.out.println("t1线程调用interrupt()后的的中断标识02:"+Thread.currentThread().isInterrupted());
}, "t1");
t1.start();

System.out.println("t1线程默认的中断标识:"+t1.isInterrupted());//false

//暂停毫秒
try { TimeUnit.MILLISECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); }
t1.interrupt();//true
System.out.println("t1线程调用interrupt()后的的中断标识01:"+t1.isInterrupted());//true

try { TimeUnit.MILLISECONDS.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); }
System.out.println("t1线程调用interrupt()后的的中断标识03:"+t1.isInterrupted());//????---false中断不活动的线程不会产生任何影响。
}

2. 睡眠状态响应中断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
		{
Thread t1 = new Thread(() -> {
while (true)
{
if(Thread.currentThread().isInterrupted())
{
System.out.println(Thread.currentThread().getName()+"\t " +
"中断标志位:"+Thread.currentThread().isInterrupted()+" 程序停止");
break;
}

try {
Thread.sleep(200);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();//为什么要在异常处,再调用一次??
e.printStackTrace();
}

System.out.println("-----hello InterruptDemo3");
}
}, "t1");
t1.start();

//暂停几秒钟线程
try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }

new Thread(() -> t1.interrupt(),"t2").start();
}

/**
* 1 中断标志位,默认false
* 2 t2 ----> t1发出了中断协商,t2调用t1.interrupt(),中断标志位true
* 3 中断标志位true,正常情况,程序停止,^_^
* 4 中断标志位true,异常情况,InterruptedException,将会把中断状态将被清除,并且将收到InterruptedException 。中断标志位false
* 导致无限循环
*
* 5 在catch块中,需要再次给中断标志位设置为true,2次调用停止程序才OK
*/

3.Thread.interrupted()用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
//测试当前线程是否被中断(检查中断标志),返回一个boolean并清除中断状态,
// 第二次再调用时中断状态已经被清除,将返回一个false。


System.out.println(Thread.currentThread().getName()+"\t"+Thread.interrupted());// false
System.out.println(Thread.currentThread().getName()+"\t"+Thread.interrupted());// false
System.out.println("----1");
Thread.currentThread().interrupt();// 中断标志位设置为true
System.out.println("----2");
System.out.println(Thread.currentThread().getName()+"\t"+Thread.interrupted());// true
System.out.println(Thread.currentThread().getName()+"\t"+Thread.interrupted());// false

LockSupport.park();

Thread.interrupted();//静态方法

Thread.currentThread().isInterrupted();//实例方法
}

本站由 卡卡龙 使用 Stellar 1.29.1主题创建

本站访问量 次. 本文阅读量 次.