欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java結(jié)束線程的三種方法及該如何選擇

 更新時(shí)間:2021年03月24日 08:44:19   作者:超人不會(huì)飛  
這篇文章主要介紹了Java結(jié)束線程的三種方法及該如何選擇,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下

java常用的結(jié)束一個(gè)運(yùn)行中的線程的方法有3中:使用退出標(biāo)志,使用interrupt方法,使用stop方法。

1.使用退出標(biāo)志

即在線程內(nèi)部定義一個(gè)bool變量來判斷是否結(jié)束當(dāng)前的線程:

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("線程退出!"); 
 }
}

這種情況一般是將線程的任務(wù)放在run方法中的一個(gè)while循環(huán)中,而由這個(gè)bool變量來對while循環(huán)進(jìn)行控制。

2.使用interrupt方法

這種方法需要判斷當(dāng)前的線程所處于的狀態(tài):
(1)當(dāng)前線程處于阻塞狀態(tài)時(shí)
線程處于阻塞狀態(tài)一般是在使用了 sleep,同步鎖的 wait,socket 中的 receiver,accept 等方法時(shí),會(huì)使線程處于阻塞狀態(tài)。

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秒之內(nèi)按任意鍵中斷線程!"); 
  System.in.read(); 
  thread.interrupt(); 
  thread.join(); 
  System.out.println("線程已經(jīng)退出!"); 
 } 
}

注意這種情況寫,使用 interrupt 方法結(jié)束線程的時(shí)候,一定要先捕獲 InterruptedException 異常之后通過 break 來跳出循環(huán),才能正常結(jié)束 run 方法。

(2)線程未處于阻塞狀態(tài)時(shí)

使用 isInterrupted() 判斷線程的中斷標(biāo)志來退出循環(huán)。當(dāng)使用 interrupt() 方法時(shí),中斷標(biāo)志就會(huì)置 true,和使用自定義的標(biāo)志來控制循環(huán)是一樣的道理。

public class ThreadSafe extends Thread {
 public void run() {
  while (!isInterrupted()) { //非阻塞過程中通過判斷中斷標(biāo)志來退出
   try {
    Thread.sleep(5*1000); //阻塞過程捕獲中斷異常來退出
   } catch (InterruptedException e) {
    e.printStackTrace();
    break; //捕獲到異常之后,執(zhí)行 break 跳出循環(huán)
   }
  }
 }
}

3.使用stop方法來結(jié)束線程

public class Main {
 public static void main(String[] args) throws InterruptedException {
  MyThread myThread = new MyThread();
  myThread.start();
  Thread.sleep(3000); // 間隔3秒后
  myThread.stop();  // 結(jié)束線程
  System.out.println("結(jié)束了");
 }
}

4.結(jié)束方法的選擇

建議使用標(biāo)志位和interrupt方法來結(jié)束線程,stop方法已經(jīng)不建議再被使用了。
因?yàn)椴捎?stop 是不安全的,主要影響點(diǎn)如下:

  1. thread.stop() 調(diào)用之后,創(chuàng)建子線程的線程就會(huì)拋出 ThreadDeatherror 的錯(cuò)誤;
  2. 調(diào)用 stop 會(huì)釋放子線程所持有的所有鎖。導(dǎo)致了該線程所持有的所有鎖的突然釋放(不可控制),那么被保護(hù)數(shù)據(jù)就有可能呈現(xiàn)不一致性。

以上就是Java結(jié)束線程的三種方法及該如何選擇的詳細(xì)內(nèi)容,更多關(guān)于Java 結(jié)束線程的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論