亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

正確中斷java線程

系統 2106 0
不提倡的stop()方法
臭名昭著的stop()停止線程的方法已不提倡使用了,原因是什么呢?
 當在一個線程對象上調用stop()方法時,這個線程對象所運行的線程就會立即停止,并拋出特殊的ThreadDeath()異常。這里的“立即”因為太“立即”了,
假如一個線程正在執行:
    synchronized void {
    
x = 3;
y = 4;
}

  由于方法是同步的,多個線程訪問時總能保證x,y被同時賦值,而如果一個線程正在執行到x = 3;時,被調用了 stop()方法,即使在同步塊中,它也干脆地stop了,這樣就產生了不完整的殘廢數據。而多線程編程中最最基礎的條件要保證數據的完整性,所以請忘記 線程的stop方法,以后我們再也不要說“停止線程”了。

  如何才能“結束”一個線程?

interupt()中斷線程

一個線程從運行到真正的結束,應該有三個階段:
  1. 正常運行.
  2. 處理結束前的工作,也就是準備結束.
  3. 結束退出.
那么如何讓一個線程結束呢?既然不能調用stop,可用的只的interrupt()方法。但interrupt()方法只是改變了線程的運行狀態,如何讓它退出運行?對于一般邏輯,只要線程狀態已經中斷,我們就可以讓它退出,這里我們定義一個線程類ThreadA,所以這樣的語句可以保證線程在中斷后就能結束運行:
     while(!isInterrupted()){
    
正常邏輯
}

,一個測試類,ThreadDemo
  這樣ThreadDemo調用interrupt()方法,isInterrupted()為true,就會退出運行。但是如果線程正在執行wait,sleep,join方法,你調用interrupt()方法,這個邏輯就不完全了。
我們可以這樣處理:
     public void run(){
    

while(!isInterrupted()){
try{
正常工作
}catch(InterruptedException e){
//nothing
}

}
}
}
想一想,如果一個正在sleep的線程,在調用interrupt后,會如何?wait方法檢查到isInterrupted()為true,拋出異常, 而你又沒有處理。而一個拋出了InterruptedException的線程的狀態馬上就會被置為非中斷狀態,如果catch語句沒有處理異常,則下一 次循環中isInterrupted()為false,線程會繼續執行,可能你N次拋出異常,也無法讓線程停止。
這個錯誤情況的實例代碼
ThreadA

public class ThreadA extends Thread ... {
int count = 0 ;
public void run() ... {
System.out.println(getName()
+ " 將要運行... " );
while ( ! this .isInterrupted()) ... {
System.out.println(getName()
+ " 運行中 " + count ++ );
try ... {
Thread.sleep(
400 );
}
catch (InterruptedExceptione) ... {
System.out.println(getName()
+ " 從阻塞中退出... " );
System.out.println(
" this.isInterrupted()= " + this .isInterrupted());

}

}

System.out.println(getName()
+ " 已經終止! " );
}

}

ThreadDemo
public class ThreadDemo ... {

public static void main(Stringargv[]) throws InterruptedException ... {
ThreadAta
= new ThreadA();
ta.setName(
" ThreadA " );
ta.start();
Thread.sleep(
2000 );
System.out.println(ta.getName()
+ " 正在被中斷... " );
ta.interrupt();
System.out.println(
" ta.isInterrupted()= " + ta.isInterrupted());
}


}


 那么如何能確保線程真正停止?在線程同步的時候我們有一個叫“二次惰性檢測”(double check),能在提高效率的基礎上又確保線程真正中同步控制中。那么我把線程正確退出的方法稱為“雙重安全退出”,即不以isInterrupted ()為循環條件。而以一個標記作為循環條件:
正確的ThreadA代碼是:


public class ThreadA extends Thread ... {
private boolean isInterrupted = false ;
int count = 0 ;

public void interrupt() ... {
isInterrupted
= true ;
super .interrupt();
}


public void run() ... {
System.out.println(getName()
+ " 將要運行... " );
while ( ! isInterrupted) ... {
System.out.println(getName()
+ " 運行中 " + count ++ );
try ... {
Thread.sleep(
400 );
}
catch (InterruptedExceptione) ... {
System.out.println(getName()
+ " 從阻塞中退出... " );
System.out.println(
" this.isInterrupted()= " + this .isInterrupted());

}

}

System.out.println(getName()
+ " 已經終止! " );
}

}




正確中斷java線程


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品永久免费10000 | 在线播放国产福利视频 | 特黄未满14周岁毛片 | 四虎永久网址 | 国产精品成人一区二区1 | 奇米第四色888 | 亚欧中文字幕 | 国产伦码精品一区二区三区 | 99热久久这里只有精品首页 | 毛片毛片毛片毛片出来毛片 | 羞羞视频免费在线观看 | 久艾草国产成人综合在线视频 | 欧美大片一区 | 在线欧美亚洲 | 91日本视频 | 狠狠色噜狠狠狠狠色综合久 | 色综合久久88色综合天天小说 | 欧美一级毛片图 | 天天做天天爽爽快快 | 91在线免费播放 | 搡女人免费的视频 | 在线精品一区二区三区 | 亚洲涩综合 | 亚洲欧美色图片 | 性色黄 | a毛片在线免费观看 | 国产欧洲亚洲 | 老司机免费精品视频 | 欧美高清成人 | 久久久久视频精品网 | 一本色道久久爱88a 一本色道久久爱88av俺来也 | 一级女性全黄生活片看看 | 九九精品国产兔费观看久久 | 久久亚洲精品专区蓝色区 | 福利国产在线 | 美女国产 | 国产成人亚洲综合无 | 久青草香蕉精品视频在线 | 青青爽| 一级片在线免费观看 | 狠狠色噜噜狠狠色综合久 |