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

正確中斷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條評論
主站蜘蛛池模板: 香蕉爱爱网| 欧美精选在线 | 久草国产精品视频 | 一本到中文字幕高清不卡在线 | 国产综合91 | 久久精品午夜视频 | 在线不卡免费视频 | 99在线精品免费视频 | 狠狠色噜噜狠狠狠狠97 | 午夜亚洲精品久久久久久 | 亚洲精品高清国产一线久久97 | 日韩精品免费一区二区 | 国产成人综合一区人人 | 亚洲国产欧洲精品路线久久 | 久久精品精品 | 一级做a免费视频观看网站 一级做a爰片久久毛片唾 | 久久我们这里只有精品国产4 | 朴妮唛禁福利视频在线 | 香蕉毛片 | 看欧美一级片 | 日本成人一区 | 亚洲免费精品视频 | 亚洲依人 | 婷婷在线视频 | 国产亚洲精品麻豆一区二区 | 一区一区三区产品乱码 | 97久久久久国产精品嫩草影院 | 亚洲国产一区二区三区精品 | 亚洲日本在线播放 | 亚洲成人免费视频在线 | 久久成人18| 亚洲精品国产第一区二区多人 | 日日夜夜伊人 | 精品一成人岛国片在线观看 | 久久99精品一级毛片 | 麻豆国内精品久久久久久 | 欧美一级毛片免费看 | 男女乱淫真视频免费一级毛片 | 亚洲精品久久久久午夜福 | 日韩精品欧美一区二区三区 | 一级黄色毛片播放 |