Java中如何正常终止线程

[TOC]

使用退出标志

使线程正常退出,也就是当 run() 方法完成后线程中止。

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
class test extends Thread{
public volatile boolean state = false;
@Override
public void run() {
while(!state){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("state的值:"+state);
}
}
public static void main(String[] args) {
test t=new test();
t.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t.state=true;
}
}
//state的值:false
//state的值:true

Interrupt()

interrupt() 方法并不像在 for 循环语句中使用 break 语句那样干脆,马上就停止循环。调用 interrupt() 方法仅仅是在当前线程中打一个停止的标记,并不是真的停止线程。

也就是说,线程中断并不会立即终止线程,而是通知目标线程,有人希望你终止。至于目标线程收到通知后会如何处理,则完全由目标线程自行决定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class test extends Thread{
public static void main(String[] args) {
try {
test t = new test();
t.start();
Thread.sleep(200);
t.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void run() {
//super.run();
for(int i = 0; i <= 2000; i++) {
System.out.println("i=" + i);
}
}
}

正确使用

Thread.currentThread().isInterrupted()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class test extends Thread{
public static void main(String[] args) {
try {
test t = new test();
t.start();
Thread.sleep(1);
t.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void run() {
//super.run();
for(int i = 0; i <= 2000; i++) {
if(Thread.currentThread().isInterrupted())
{
break;
}
System.out.println("i=" + i);
}
}
}

使用 stop() 终止线程

为什么弃用stop:

  1. 调用 stop() 方法会立刻停止 run() 方法中剩余的全部工作,包括在 catch 或 finally 语句中的,因此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭。
  2. 调用 stop() 方法会立即释放该线程所持有的所有的锁,导致数据得不到同步,出现数据不一致的问题。