91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中終止線程的方法詳解

發布時間:2020-08-30 21:46:44 來源:腳本之家 閱讀:146 作者:Smile_Miracle 欄目:編程語言

Java中終止線程的方式主要有三種:

1、使用stop()方法,已被棄用。原因是:stop()是立即終止,會導致一些數據被到處理一部分就會被終止,而用戶并不知道哪些數據被處理,哪些沒有被處理,產生了不完整的“殘疾”數據,不符合完整性,所以被廢棄。So, forget it!

2、使用volatile標志位

看一個簡單的例子:

首先,實現一個Runnable接口,在其中定義volatile標志位,在run()方法中使用標志位控制程序運行

public class MyRunnable implements Runnable { 

 //定義退出標志,true會一直執行,false會退出循環 
 //使用volatile目的是保證可見性,一處修改了標志,處處都要去主存讀取新的值,而不是使用緩存 
 public volatile boolean flag = true; 

 public void run() { 
  System.out.println("第" + Thread.currentThread().getName() + "個線程創建"); 

  try { 
   Thread.sleep(1000L); 
  } catch (InterruptedException e) { 
   e.printStackTrace(); 
  } 

  //退出標志生效位置 
  while (flag) { 
  } 
  System.out.println("第" + Thread.currentThread().getName() + "個線程終止"); 
 } 
}

然后,在main()方法中創建線程,在合適的時候,修改標志位,終止運行中的線程。

public class TreadTest { 
 public static void main(String[] arg) throws InterruptedException { 
  MyRunnable runnable = new MyRunnable(); 

  //創建3個線程 
  for (int i = 1; i <= 3; i++) { 
   Thread thread = new Thread(runnable, i + ""); 
   thread.start(); 
  } 
  //線程休眠 
  Thread.sleep(2000L); 
  System.out.println("——————————————————————————"); 
  //修改退出標志,使線程終止 
  runnable.flag = false; 
 } 
}

最后,運行結果,如下:

第1個線程創建
第2個線程創建
第3個線程創建
--------------------------
第3個線程終止
第1個線程終止
第2個線程終止

3、使用interrupt()中斷的方式,注意使用interrupt()方法中斷正在運行中的線程只會修改中斷狀態位,可以通過isInterrupted()判斷。如果使用interrupt()方法中斷阻塞中的線程,那么就會拋出InterruptedException異常,可以通過catch捕獲異常,然后進行處理后終止線程。有些情況,我們不能判斷線程的狀態,所以使用interrupt()方法時一定要慎重考慮。

第一種:正在運行中終止

public class MyThread extends Thread {
 public void run(){
  super.run();
  try {
   for(int i=0; i<500000; i++){
    if(this.interrupted()) {
     System.out.println("線程已經終止, for循環不再執行");
      throw new InterruptedException();
    }
    System.out.println("i="+(i+1));
   }

   System.out.println("這是for循環外面的語句,也會被執行");
  } catch (InterruptedException e) {
   System.out.println("進入MyThread.java類中的catch了。。。");
   e.printStackTrace();
  }
 }
}

public class Run {
 public static void main(String args[]){
  Thread thread = new MyThread();
  thread.start();
  try {
   Thread.sleep(2000);
   thread.interrupt();
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }
}

運行結果如下:

...
i=203798
i=203799
i=203800
線程已經終止, for循環不再執行
進入MyThread.java類中的catch了。。。
java.lang.InterruptedException
 at thread.MyThread.run(MyThread.java:13)

第二種:阻塞狀態(sleep,wait等)終止

public class MyThread extends Thread {
 public void run(){
  super.run();

  try {
   System.out.println("線程開始。。。");
   Thread.sleep(200000);
   System.out.println("線程結束。");
  } catch (InterruptedException e) {
   System.out.println("在沉睡中被停止, 進入catch, 調用isInterrupted()方法的結果是:" + this.isInterrupted());
   e.printStackTrace();
  }

 }
}

線程開始。。。
在沉睡中被停止, 進入catch, 調用isInterrupted()方法的結果是:false
java.lang.InterruptedException: sleep interrupted
 at java.lang.Thread.sleep(Native Method)
 at thread.MyThread.run(MyThread.java:12)

從打印的結果來看, 如果在sleep狀態下停止某一線程,會進入catch語句,并且清除停止狀態值,使之變為false。

前一個實驗是先sleep然后再用interrupt()停止,與之相反的操作在學習過程中也要注意:

public class MyThread extends Thread {
 public void run(){
  super.run();
  try {
   System.out.println("線程開始。。。");
   for(int i=0; i<10000; i++){
    System.out.println("i=" + i);
   }
   Thread.sleep(200000);
   System.out.println("線程結束。");
  } catch (InterruptedException e) {
    System.out.println("先停止,再遇到sleep,進入catch異常");
   e.printStackTrace();
  }

 }
}

public class Run {
 public static void main(String args[]){
  Thread thread = new MyThread();
  thread.start();
  thread.interrupt();
 }
}

運行結果:

i=9998
i=9999
先停止,再遇到sleep,進入catch異常
java.lang.InterruptedException: sleep interrupted
 at java.lang.Thread.sleep(Native Method)
 at thread.MyThread.run(MyThread.java:15)

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

荥经县| 扎兰屯市| 菏泽市| 和平区| 莲花县| 抚顺市| 页游| 仁化县| 大足县| 奉化市| 志丹县| 濮阳市| 德令哈市| 奉新县| 广南县| 滦平县| 灵璧县| 沂水县| 隆昌县| 浪卡子县| 喀喇| 宜兰市| 岚皋县| 永平县| 宝兴县| 新田县| 祁阳县| 洞头县| 南汇区| 宁夏| 莲花县| 莆田市| 南昌县| 元江| 鄂州市| 祁门县| 通渭县| 石城县| 寻甸| 永和县| 泸定县|