java罕用的完结一个运行中的线程的办法有3中:应用退出标记,应用interrupt办法,应用stop办法。

1.应用退出标记

即在线程外部定义一个bool变量来判断是否完结以后的线程:

public class ThreadSafe extends Thread {    public volatile boolean exit = false;    public void run() {        while (!exit){            //do work        }    }    public static void main(String[] args) throws Exception  {          ThreadFlag thread = new ThreadFlag();          thread.start();          sleep(5000);  // 主线程提早5秒         thread.exit = true;   // 终止线程thread         thread.join();          System.out.println("线程退出!");      }}

这种状况个别是将线程的工作放在run办法中的一个while循环中,而由这个bool变量来对while循环进行管制。

2.应用interrupt办法

这种办法须要判断以后的线程所处于的状态:
(1)以后线程处于阻塞状态时
线程处于阻塞状态个别是在应用了 sleep,同步锁的 wait,socket 中的 receiver,accept 等办法时,会使线程处于阻塞状态。

public class ThreadInterrupt extends Thread {      public void run()  {          try {              sleep(50000);  // 提早50秒         }          catch (InterruptedException e) {              System.out.println(e.getMessage());          }      }      public static void main(String[] args) throws Exception  {          Thread thread = new ThreadInterrupt();          thread.start();          System.out.println("在50秒之内按任意键中断线程!");          System.in.read();          thread.interrupt();          thread.join();          System.out.println("线程曾经退出!");      }  }

留神这种状况写,应用 interrupt 办法完结线程的时候,肯定要先捕捉 InterruptedException 异样之后通过 break 来跳出循环,能力失常完结 run 办法。

(2)线程未处于阻塞状态时

应用 isInterrupted() 判断线程的中断标记来退出循环。当应用 interrupt() 办法时,中断标记就会置 true,和应用自定义的标记来管制循环是一样的情理。

public class ThreadSafe extends Thread {    public void run() {        while (!isInterrupted()) {   //非阻塞过程中通过判断中断标记来退出            try {                Thread.sleep(5*1000);  //阻塞过程捕捉中断异样来退出            } catch (InterruptedException e) {                e.printStackTrace();                break;  //捕捉到异样之后,执行 break 跳出循环            }        }    }}

3.应用stop办法来完结线程

public class Main {    public static void main(String[] args) throws InterruptedException {        MyThread myThread = new MyThread();        myThread.start();        Thread.sleep(3000);   // 距离3秒后        myThread.stop();      // 完结线程        System.out.println("完结了"); }}

4.完结办法的抉择

倡议应用标记位interrupt办法来完结线程,stop办法曾经不倡议再被应用了。
因为采纳 stop 是不平安的,次要影响点如下:

  1. thread.stop() 调用之后,创立子线程的线程就会抛出 ThreadDeatherror 的谬误;
  2. 调用 stop 会开释子线程所持有的所有锁。导致了该线程所持有的所有锁的忽然开释(不可管制),那么被爱护数据就有可能出现不一致性。