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

淺析java線程中斷的辦法

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

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

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

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

void thread.stop()

這個(gè)方法能中斷正在運(yùn)行的線程,但是已經(jīng)不推薦使用了,在將來的版本或許棄用,因?yàn)閺?qiáng)行中斷運(yùn)行中的線程,是不安全的。

void thread.interrupt()

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

boolean thread.isInterrupted()

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

void Thread.interrupted()

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

阻塞的退出線程

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

package com.xiaojiezhu.thread;

/**
 * @author xiaojie.zhu
 */
public class ThreadBreak2 implements Runnable {
  @Override
  public void run() {
    try {
      Thread.sleep(20000);
      System.out.println("這段話不會(huì)輸出");
    } catch (InterruptedException e) {
      //如果在sleep()的過程中調(diào)用了interrupt()方法,就會(huì)進(jìn)入這里,因?yàn)闀?huì)強(qiáng)行中斷sleep()
      
      //這里打印出來的中斷標(biāo)記為false,因?yàn)橹灰M(jìn)入了InterruptedException異常,中斷標(biāo)記就會(huì)被清除掉
      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)

注意:因?yàn)橹灰M(jìn)入了InterruptedException異常,中斷標(biāo)記就會(huì)被清除掉

這里會(huì)衍生出另一種情況,就是如果在進(jìn)入阻塞方法之前,就有了中斷標(biāo)記呢?會(huì)發(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();
}

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

完整的測(cè)試代碼如下

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()方法是一個(gè)不安全的方法,已經(jīng)不推薦使用了,但是在目前的代碼中,還能正常使用,我們不推薦這樣使用,但是這里介紹一下

package com.xiaojiezhu.thread;

/**
 * @author xiaojie.zhu
 */
public class ThreadBreak4 implements Runnable {
  @Override
  public void run() {
    System.out.println("進(jìn)入線程");
    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é)果如下

進(jìn)入線程
over

  • JavaScript?中的行繼續(xù)符操作

    JavaScript?中的行繼續(xù)符操作

    JavaScript?中的字符串操作可能很復(fù)雜,?盡管字符串操作易于掌握,但實(shí)施起來卻具有挑戰(zhàn)性,其中一個(gè)相關(guān)領(lǐng)域是添加新行,這篇文章主要介紹了JavaScript中的行繼續(xù)符操作,需要的朋友可以參考下
    2023-06-06
  • Javascript 函數(shù)parseInt()轉(zhuǎn)換時(shí)出現(xiàn)bug問題

    Javascript 函數(shù)parseInt()轉(zhuǎn)換時(shí)出現(xiàn)bug問題

    天測(cè)試的測(cè)出來的。parseInt(1.13*100),實(shí)際返回值是112,下面有個(gè)示例,大家可以看看下
    2014-05-05
  • javascript實(shí)現(xiàn)博客園頁(yè)面右下角返回頂部按鈕

    javascript實(shí)現(xiàn)博客園頁(yè)面右下角返回頂部按鈕

    這篇文章主要介紹了使用javascript實(shí)現(xiàn)博客園頁(yè)面右下角返回頂部按鈕的思路及源碼,非常不錯(cuò),這里推薦給小伙伴們
    2015-02-02
  • 不用AJAX和IFRAME,說說真正意義上的ASP+JS無刷新技術(shù)

    不用AJAX和IFRAME,說說真正意義上的ASP+JS無刷新技術(shù)

    注明:以下方法都經(jīng)過實(shí)例和開發(fā)的長(zhǎng)期驗(yàn)證,其實(shí)這些技術(shù)早就有,今天只不過自己歸納一下
    2008-09-09
  • 完美解決spring websocket自動(dòng)斷開連接再創(chuàng)建引發(fā)的問題

    完美解決spring websocket自動(dòng)斷開連接再創(chuàng)建引發(fā)的問題

    下面小編就為大家?guī)硪黄昝澜鉀Qspring websocket自動(dòng)斷開連接再創(chuàng)建引發(fā)的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • js事件綁定快捷鍵以ctrl+k為例

    js事件綁定快捷鍵以ctrl+k為例

    js為快捷鍵綁定事件,當(dāng)按這個(gè)快捷鍵時(shí)就會(huì)觸發(fā)事先綁定處理函數(shù),下面以ctrl+k為例與大家分享下具體的實(shí)現(xiàn)代碼
    2014-09-09
  • 在IE模態(tài)窗口中自由查看HTML源碼的方法

    在IE模態(tài)窗口中自由查看HTML源碼的方法

    在IE模態(tài)窗口中自由查看HTML源碼的方法...
    2007-03-03
  • 寫了一個(gè)layout,拖動(dòng)條連貫,內(nèi)容區(qū)可為iframe

    寫了一個(gè)layout,拖動(dòng)條連貫,內(nèi)容區(qū)可為iframe

    寫了一個(gè)layout,拖動(dòng)條連貫,內(nèi)容區(qū)可為iframe...
    2007-08-08
  • arctext.js實(shí)現(xiàn)文字平滑彎曲弧形效果的插件

    arctext.js實(shí)現(xiàn)文字平滑彎曲弧形效果的插件

    這篇文章主要介紹了arctext.js實(shí)現(xiàn)文字平滑彎曲弧形效果的插件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 最新評(píng)論

    阳西县| 云阳县| 扬中市| 汝阳县| 枝江市| 永丰县| 伊春市| 庆云县| 上林县| 织金县| 邢台市| 大兴区| 邛崃市| 遂溪县| 大姚县| 都安| 镇雄县| 洛南县| 河南省| 张家界市| 长乐市| 林甸县| 绥阳县| 望谟县| 山阳县| 方山县| 湘潭县| 罗定市| 财经| 澄迈县| 凤阳县| 云南省| 曲阳县| 东兰县| 莱芜市| 阿拉善左旗| 金门县| 米脂县| 景谷| 新建县| 安义县|