日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

正確中斷java線程

系統(tǒng) 2422 0
不提倡的stop()方法
臭名昭著的stop()停止線程的方法已不提倡使用了,原因是什么呢?
 當(dāng)在一個(gè)線程對(duì)象上調(diào)用stop()方法時(shí),這個(gè)線程對(duì)象所運(yùn)行的線程就會(huì)立即停止,并拋出特殊的ThreadDeath()異常。這里的“立即”因?yàn)樘傲⒓础绷耍?
假如一個(gè)線程正在執(zhí)行:
    synchronized void {
    
x = 3;
y = 4;
}

  由于方法是同步的,多個(gè)線程訪問(wèn)時(shí)總能保證x,y被同時(shí)賦值,而如果一個(gè)線程正在執(zhí)行到x = 3;時(shí),被調(diào)用了 stop()方法,即使在同步塊中,它也干脆地stop了,這樣就產(chǎn)生了不完整的殘廢數(shù)據(jù)。而多線程編程中最最基礎(chǔ)的條件要保證數(shù)據(jù)的完整性,所以請(qǐng)忘記 線程的stop方法,以后我們?cè)僖膊灰f(shuō)“停止線程”了。

  如何才能“結(jié)束”一個(gè)線程?

interupt()中斷線程

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

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

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

}
}
}
想一想,如果一個(gè)正在sleep的線程,在調(diào)用interrupt后,會(huì)如何?wait方法檢查到isInterrupted()為true,拋出異常, 而你又沒(méi)有處理。而一個(gè)拋出了InterruptedException的線程的狀態(tài)馬上就會(huì)被置為非中斷狀態(tài),如果catch語(yǔ)句沒(méi)有處理異常,則下一 次循環(huán)中isInterrupted()為false,線程會(huì)繼續(xù)執(zhí)行,可能你N次拋出異常,也無(wú)法讓線程停止。
這個(gè)錯(cuò)誤情況的實(shí)例代碼
ThreadA

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

}

}

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

}

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());
}


}


 那么如何能確保線程真正停止?在線程同步的時(shí)候我們有一個(gè)叫“二次惰性檢測(cè)”(double check),能在提高效率的基礎(chǔ)上又確保線程真正中同步控制中。那么我把線程正確退出的方法稱為“雙重安全退出”,即不以isInterrupted ()為循環(huán)條件。而以一個(gè)標(biāo)記作為循環(huán)條件:
正確的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()
+ " 將要運(yùn)行... " );
while ( ! isInterrupted) ... {
System.out.println(getName()
+ " 運(yùn)行中 " + count ++ );
try ... {
Thread.sleep(
400 );
}
catch (InterruptedExceptione) ... {
System.out.println(getName()
+ " 從阻塞中退出... " );
System.out.println(
" this.isInterrupted()= " + this .isInterrupted());

}

}

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

}




正確中斷java線程


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 革吉县| 长治市| 泾阳县| 道孚县| 崇州市| 辽中县| 南阳市| 大埔区| 望都县| 全椒县| 永泰县| 辉南县| 台南市| 四会市| 北宁市| 和田县| 常德市| 桐庐县| 雷山县| 瑞昌市| 卓尼县| 大余县| 江门市| 桓仁| 乐清市| 涟水县| 英山县| 三都| 泽库县| 涞水县| 平定县| 开原市| 西城区| 亳州市| 北票市| 长武县| 新干县| 化隆| 吉安县| 万源市| 高清|