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

淺析java線程中斷的辦法

 更新時間:2018年07月29日 17:35:29   作者:朱小杰  
這篇文章給大家分享了java線程中斷的辦法以及相關(guān)知識點內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。

中斷線程相關(guān)的方法

中斷線程有一些相應(yīng)的方法,這里列出來一下。

注意,如果是Thread.method(),則代表是靜態(tài)方法。如果是thread.method()則代表著是類方法

void thread.stop()

這個方法能中斷正在運行的線程,但是已經(jīng)不推薦使用了,在將來的版本或許棄用,因為強行中斷運行中的線程,是不安全的。

void thread.interrupt()

如果正在運行wait(),sleep(),join()這三個方法阻塞了線程,那么將會使得線程拋出InterruptedException異常,這是一個中斷阻塞的過程。如果是其它的正在運行的狀態(tài),那么將不會有任何影響,也不會中斷線程,或者拋出異常,只會會打上一個中斷線程的標(biāo)志,是否中斷線程,將由程序控制。

boolean thread.isInterrupted()

它會獲取當(dāng)前線程的標(biāo)志,如果之前調(diào)用過thread.interrupt(),那么它的返回值是true。它的作用就是返回該線程是否有中斷標(biāo)志。多次調(diào)用這個方法的結(jié)果是一樣的。

void Thread.interrupted()

與前面的方法不一樣的是,這是一個靜態(tài)方法,代表著不需要拿到線程對象就可以直接執(zhí)行,所以它的作用是返回當(dāng)前線程是否有中斷標(biāo)志。但是它的區(qū)別是,當(dāng)調(diào)用這個方法之后,會清除程序的中斷標(biāo)志,就是如果當(dāng)前線程已中斷,第一次調(diào)用這個方法的返回值是true,第二次調(diào)用這個方法的返回值為false,因為調(diào)用方法時,會清除它的中斷標(biāo)志。

中斷線程

for循環(huán)標(biāo)記退出

package com.xiaojiezhu.thread;

/**
 * @author xiaojie.zhu
 */
public class ThreadBreak implements Runnable {

  @Override
  public void run() {
    for(int i = 0 ; i < 10000 ; i ++){
      boolean interruped = Thread.currentThread().isInterrupted();
      if(interruped){
        //有中斷標(biāo)記,中斷
        break;
      }
      System.out.println(i);
    }

    System.out.println("over");
  }


  public static void main(String[] args) throws InterruptedException {
    Thread t = new Thread(new ThreadBreak());
    t.start();
    Thread.sleep(1);

    t.interrupt();
  }
}

打印結(jié)果如下

44
45
46
47
over

阻塞的退出線程

只要是在運行wait(),sleep(),join()的方法,它就會聲明一個InterruptedException異常,也就是意味著這些方法并不是一定能執(zhí)行完成,因為當(dāng)調(diào)用線程的interrupt()方法時,就會中斷這個阻塞的辦法,從而進入到異常中,代碼如下

package com.xiaojiezhu.thread;

/**
 * @author xiaojie.zhu
 */
public class ThreadBreak2 implements Runnable {
  @Override
  public void run() {
    try {
      Thread.sleep(20000);
      System.out.println("這段話不會輸出");
    } catch (InterruptedException e) {
      //如果在sleep()的過程中調(diào)用了interrupt()方法,就會進入這里,因為會強行中斷sleep()
      
      //這里打印出來的中斷標(biāo)記為false,因為只要進入了InterruptedException異常,中斷標(biāo)記就會被清除掉
      System.out.println("中斷標(biāo)記為:" + Thread.currentThread().isInterrupted());
      System.out.println("輸出異常");
      e.printStackTrace();
    }
  }

  public static void main(String[] args) throws InterruptedException {
    Thread t = new Thread(new ThreadBreak2());
    t.start();

    Thread.sleep(100);

    t.interrupt();

    System.out.println("over");
  }
}

打印結(jié)果如下

over
中斷標(biāo)記為:false
輸出異常
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.xiaojiezhu.thread.ThreadBreak2.run(ThreadBreak2.java:10)
at java.lang.Thread.run(Thread.java:748)

注意:因為只要進入了InterruptedException異常,中斷標(biāo)記就會被清除掉

這里會衍生出另一種情況,就是如果在進入阻塞方法之前,就有了中斷標(biāo)記呢?會發(fā)生什么,就如下的代碼:

for(int i = 0 ; i < 10000 ; i ++){
  System.out.println(i);
}
try {
  System.out.println("開始sleep");
  Thread.sleep(20000);
  System.out.println("結(jié)束sleep");

} catch (InterruptedException e) {
  e.printStackTrace();
}

實際上它會先執(zhí)行完上面的for循環(huán),因為for循環(huán)中是無法中止的,在進入sleep()的時候,瞬間就拋出異常

完整的測試代碼如下

package com.xiaojiezhu.thread;

/**
 * @author xiaojie.zhu
 */
public class ThreadBreak3 implements Runnable {

  @Override
  public void run() {
    for(int i = 0 ; i < 10000 ; i ++){
      System.out.println(i);
    }
    try {
      System.out.println("開始sleep");
      Thread.sleep(20000);
      System.out.println("結(jié)束sleep");

    } catch (InterruptedException e) {
      e.printStackTrace();
    }

  }

  public static void main(String[] args) {
    Thread thread = new Thread(new ThreadBreak3());
    thread.start();

    thread.interrupt();
  }
}

打印結(jié)果如下

9997
9998
9999
開始sleep
java.lang.InterruptedException: sleep interrupted
  at java.lang.Thread.sleep(Native Method)
  at com.xiaojiezhu.thread.ThreadBreak3.run(ThreadBreak3.java:15)
  at java.lang.Thread.run(Thread.java:748)

使用stop()方法停止線程

thread.stop()方法是一個不安全的方法,已經(jīng)不推薦使用了,但是在目前的代碼中,還能正常使用,我們不推薦這樣使用,但是這里介紹一下

package com.xiaojiezhu.thread;

/**
 * @author xiaojie.zhu
 */
public class ThreadBreak4 implements Runnable {
  @Override
  public void run() {
    System.out.println("進入線程");
    try {
      Thread.sleep(20000);
      System.out.println("結(jié)束線程");
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

  }

  public static void main(String[] args) {
    Thread t = new Thread(new ThreadBreak4());
    t.start();
    try {
      Thread.sleep(200);

      t.stop();

      System.out.println("over");
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}

打印結(jié)果如下

進入線程
over

相關(guān)文章

  • JavaScript 常見的繼承方式匯總

    JavaScript 常見的繼承方式匯總

    這篇文章主要匯總了JavaScript 常見的繼承方式,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下
    2020-09-09
  • JS只能輸入正整數(shù)的簡單實例

    JS只能輸入正整數(shù)的簡單實例

    下面小編就為大家?guī)硪黄狫S只能輸入正整數(shù)的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • 微信小程序scroll-view實現(xiàn)橫向滾動和上拉加載示例

    微信小程序scroll-view實現(xiàn)橫向滾動和上拉加載示例

    本篇文章主要介紹了微信小程序scroll-view實現(xiàn)橫向滾動和上拉加載示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • Javascript實現(xiàn)蘋果懸浮虛擬按鈕

    Javascript實現(xiàn)蘋果懸浮虛擬按鈕

    本文給大家分享的是使用javascript實現(xiàn)仿制蘋果的懸浮虛擬按鈕的代碼,非常的簡單,給大家一個思路,大家可以根據(jù)自己的情況自由擴展。
    2016-04-04
  • 淺談Webpack4 plugins 實現(xiàn)原理

    淺談Webpack4 plugins 實現(xiàn)原理

    在wabpack 核心功能除了loader應(yīng)該就是plugins插件了,本文主要介紹了Webpack4 plugins 實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • JS之判斷是否為對象或數(shù)組的幾種方式總結(jié)

    JS之判斷是否為對象或數(shù)組的幾種方式總結(jié)

    這篇文章主要介紹了JS之判斷是否為對象或數(shù)組的幾種方式總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • javascript中利用柯里化函數(shù)實現(xiàn)bind方法【推薦】

    javascript中利用柯里化函數(shù)實現(xiàn)bind方法【推薦】

    下面小編就為大家?guī)硪黄猨avascript中利用柯里化函數(shù)實現(xiàn)bind方法【推薦】。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考,一起跟隨小編過來看看吧
    2016-04-04
  • JavaScript中閉包的詳解

    JavaScript中閉包的詳解

    本文主要介紹了JavaScript中閉包的相關(guān)知識。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • 使用jscript實現(xiàn)二進制讀寫腳本代碼

    使用jscript實現(xiàn)二進制讀寫腳本代碼

    Reading And Writing Binary Files Using JScript正如我剛才推什么我能做的JScript中,我想出了對問題的二進制文件。以下級的解決,這為小到中等大小的文件。我的部分包括這個職位在這里,因為我即將付諸表決,在一個職位約發(fā)送帶有附件的電郵通過JScript和它會使用這個二進制文件碼來讀取,在二進制附件檔案。
    2008-06-06
  • Threejs實現(xiàn)滴滴官網(wǎng)首頁地球動畫功能

    Threejs實現(xiàn)滴滴官網(wǎng)首頁地球動畫功能

    這篇文章主要介紹了Threejs實現(xiàn)滴滴官網(wǎng)首頁地球動畫效果,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07

最新評論