最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中終止線程的方法詳解

 更新時間:2017年05月11日 08:55:06   作者:Smile_Miracle  
這篇文章主要介紹了Java中終止線程的方法詳解的相關資料,需要的朋友可以參考下

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

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

2、使用volatile標志位

看一個簡單的例子:

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

public class MyRunnable implements Runnable { 

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

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

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

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

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

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

  //創(chuàng)建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; 
 } 
}

最后,運行結(jié)果,如下:

第1個線程創(chuàng)建
第2個線程創(chuàng)建
第3個線程創(chuàng)建
--------------------------
第3個線程終止
第1個線程終止
第2個線程終止

3、使用interrupt()中斷的方式,注意使用interrupt()方法中斷正在運行中的線程只會修改中斷狀態(tài)位,可以通過isInterrupted()判斷。如果使用interrupt()方法中斷阻塞中的線程,那么就會拋出InterruptedException異常,可以通過catch捕獲異常,然后進行處理后終止線程。有些情況,我們不能判斷線程的狀態(tài),所以使用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("線程已經(jīng)終止, for循環(huán)不再執(zhí)行");
      throw new InterruptedException();
    }
    System.out.println("i="+(i+1));
   }

   System.out.println("這是for循環(huán)外面的語句,也會被執(zhí)行");
  } 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();
  }
 }
}

運行結(jié)果如下:

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

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

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

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

 }
}

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

從打印的結(jié)果來看, 如果在sleep狀態(tài)下停止某一線程,會進入catch語句,并且清除停止狀態(tài)值,使之變?yōu)閒alse。

前一個實驗是先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("線程結(jié)束。");
  } 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();
 }
}

運行結(jié)果:

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)

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

相關文章

  • java面向?qū)ο缶幊填惖膬?nèi)聚性分析

    java面向?qū)ο缶幊填惖膬?nèi)聚性分析

    高內(nèi)聚、低耦合是軟件設計中非常關鍵的概念。在面向?qū)ο蟪绦蛟O計中類的劃分時,類的內(nèi)聚性越高,其封裝性越好,越容易復用
    2021-10-10
  • Java類加載器和類加載機制實例分析

    Java類加載器和類加載機制實例分析

    這篇文章主要介紹了Java類加載器和類加載機制,結(jié)合實例形式分析了java類加載器與類加載機制原理、實現(xiàn)方法及相關操作技巧,需要的朋友可以參考下
    2019-07-07
  • java發(fā)送短信系列之限制發(fā)送頻率

    java發(fā)送短信系列之限制發(fā)送頻率

    這篇文章主要為大家詳細介紹了java發(fā)送短信系列之限制發(fā)送頻率,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-02-02
  • 一篇文章帶你了解Maven的繼承和聚合

    一篇文章帶你了解Maven的繼承和聚合

    這篇文章主要為大家介紹了Maven的繼承和聚合,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • java設計模式之簡單工廠模式簡述

    java設計模式之簡單工廠模式簡述

    這篇文章主要為大家詳細介紹了java設計模式之簡單工廠模式,簡單工廠模式的實質(zhì)是由一個工廠類根據(jù)傳入的參數(shù),動態(tài)決定應該創(chuàng)建哪一個產(chǎn)品類的實例,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Spring Boot 中嵌入式 Servlet 容器自動配置原理解析

    Spring Boot 中嵌入式 Servlet 容器自動配置原理解析

    這篇文章主要介紹了Spring Boot 中嵌入式 Servlet 容器自動配置原理解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring?Boot?如何正確讀取配置文件屬性

    Spring?Boot?如何正確讀取配置文件屬性

    這篇文章主要介紹了Spring?Boot?如何正確讀取配置文件屬性,項目中經(jīng)常會經(jīng)常讀取配置文件中的屬性的值,Spring?Boot提供了很多注解讀取配置文件屬性,那么如何正確使用呢,下文一起來參考下面文章內(nèi)容吧
    2022-04-04
  • 使用SpringSecurity設置角色和權限的注意點

    使用SpringSecurity設置角色和權限的注意點

    這篇文章主要介紹了使用SpringSecurity設置角色和權限的注意點,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 分享關于JAVA 中使用Preferences讀寫注冊表時要注意的地方

    分享關于JAVA 中使用Preferences讀寫注冊表時要注意的地方

    這篇文章介紹了關于JAVA 中使用Preferences讀寫注冊表時要注意的地方,有需要的朋友可以參考一下
    2013-08-08
  • JAVA 深層拷貝 DeepCopy的使用詳解

    JAVA 深層拷貝 DeepCopy的使用詳解

    最近需要用到比較兩個對象屬性的變化,其中一個是oldObj,另外一個是newObj,oldObj是newObj的前一個狀態(tài),所以需要在newObj的某個狀態(tài)時,復制一個一樣的對象,由于JAVA不支持深層拷貝,因此專門寫了一個方法
    2013-07-07

最新評論

临西县| 凤冈县| 文登市| 台东县| 高州市| 纳雍县| 青龙| 西和县| 南昌市| 微山县| 兴业县| 安化县| 崇义县| 武宁县| 阳曲县| 股票| 宁陕县| 云龙县| 上蔡县| 大宁县| 富平县| 建水县| 凭祥市| 海宁市| 乌拉特前旗| 四平市| 德令哈市| 汾阳市| 建始县| 保康县| 五峰| 库尔勒市| 昌江| 武城县| 台中县| 东方市| 房产| 奉节县| 梓潼县| 吐鲁番市| 苏尼特右旗|