4-5-终止线程4方式

文章目录
  1. 1. 终止线程4种方式
    1. 1.1. 1.正常结束
    2. 1.2. 2.使用volatile退出标志退出
    3. 1.3. 3.interrupt方式结束
      1. 1.3.1. 线程处于阻塞,catch interruptException然后break跳出
      2. 1.3.2. 线程未处于阻塞,用isInterrupted()来跳出循环
    4. 1.4. 4.stop方法终止(线程不安全,像关机,释放锁,其他线程用脏数据)

终止线程4种方式

1.正常结束

2.使用volatile退出标志退出

1
2
3
4
5
6
7
8
public class ThreadSafe extends Thread {
public volatile boolean exit = false;
public void run() {
while (!exit){
//do something
}
}
}

使用了一个 Java 关键字 volatile,这个关键字的目的是使 exit 同步,也就是说在同一时刻只能由一个线程来修改 exit 的值。

3.interrupt方式结束

线程处于阻塞,catch interruptException然后break跳出

  1. 使用了 sleep,同步锁的 wait,socket 中的 receiver,accept 等方法时,会使线程处于阻塞状态。

  2. 先捕获 InterruptedException 异常

  3. 之后通过 break 来跳出循环,才能正

    常结束 run 方法

线程未处于阻塞,用isInterrupted()来跳出循环

1
2
3
4
5
6
7
8
9
10
11
12
 public class ThreadSafe extends Thread {
public void run() {
while (!isInterrupted()){ //非阻塞过程中通过判断中断标志来退出
try{
Thread.sleep(5*1000);//阻塞过程捕获中断异常来退出
}catch(InterruptedException e){
e.printStackTrace();
break;//捕获到异常之后,执行 break 跳出循环
}
}
}
}

4.stop方法终止(线程不安全,像关机,释放锁,其他线程用脏数据)

是 stop 方法是很危险的,就象突然关闭计算机电源,而不是按正常程序关机一样,可能会产生不可预料的结果,不安全主要是:

  1. thread.stop()调用之后,创建子线程的线程就会抛出 ThreadDeatherror 的错误,并且会释放子线程所持有的所有锁。

  2. 一般任何进行加锁的代码块,都是为了保护数据的一致性,如果在调用thread.stop()后导致了该线程所持有的所有锁的突然释放(不可控制),

  3. 那么被保护数据就有可能呈现不一致性,其他线程在使用这些被破坏的数据时,有可能导致一些很奇怪的应用程序错误。