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

正確中斷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條評論
主站蜘蛛池模板: 久久桃花综合 | 999毛片免费 | 精品日本亚洲一区二区三区 | 九九视频在线观看6 | 欧美色v| 亚洲一区二区福利视频 | 4虎最新网址| 九九九九在线精品免费视频 | 日日噜噜夜夜狠狠tv视频免费 | 狠狠色丁香婷综合久久 | 黄色在线观看免费 | 亚洲国产日韩欧美综合久久 | 亚洲成色综合一区二区三区四区 | 99视频国产热精品视频 | 色噜噜狠狠色综合免费视频 | 奇米四色在线观看 | 久久亚洲热 | 色综合网亚洲精品久久久 | 日韩字幕无线乱码 | 亚洲精品成人一区二区aⅴ 亚洲精品成人一区二区www | 婷婷综合久久中文字幕 | 野花成人 | 最近中文字幕在线视频1 | 91在线播放免费不卡无毒 | 日本二区在线观看 | 国产一起色一起爱 | 中文字幕 日韩在线 | 麻豆精品久久久一区二区 | 亚洲国产精品不卡毛片a在线 | 国产免费一区二区三区香蕉精 | 国产成人精品日本亚洲麻豆 | 欧美va亚洲va国产综合 | 九九视频只有精品 | 国产精品国产国产aⅴ | 国产精品1区2区3区 国产精品1区2区3区在线播放 | 香蕉视频网站在线播放 | 成年女人免费看一级人体片 | 亚洲在线视频免费观看 | 色综合亚洲天天综合网站 | 四虎欧美永久在线精品免费 | 看一级特黄a大片日本片黑人 |