JAVA中断线程的方法
生活随笔
收集整理的這篇文章主要介紹了
JAVA中断线程的方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
JAVA中斷線程的方法???
Thread.stop,?Thread.suspend,?Thread.resume?和Runtime.runFinalizersOnExit?這些終止線程運行的方法已經被廢棄,使用它們是極端不安全的!
?
現在,如果你要安全有效地終止一個線程,應該采用以下這些方法:
?
1,線程正常執行完畢,正常結束。
也就是讓run方法執行完畢,該線程就會正常結束。
?
2,監視某些條件,結束線程的不間斷運行。
然而,常常有些線程是伺服線程。它們需要長時間的運行,只有在外部某些條件滿足的情況下,才能關閉這些線程。
通常,它們執行在一個while(true)的死循環中。
如:
@Override
????publicvoid?run()?{
??????
???????while(true){
???????????someWork();
???????????if(finished){
??????????????break;
???????????}
???????????try?{
??????????????Thread.sleep(10000);
???????????}?catch?(InterruptedException?e)?{
?????????????
??????????????e.printStackTrace();
???????????}
???????}
?
???}
我們可以在while死循環內,每次循環時,察看外部條件,看看是否需要關閉當前線程。如果是,就break,跳出死循環,或者是拋出異常,跳出死循環,結束線程。
?
3,捕獲InterruptedException?運行時異常,中斷當前線程。
有些執行伺服任務的線程,在while(true)這樣的死循環內部,是一個阻塞中的方法。此時,就不能采用第二種方法了。因為,當該方法沒有返回時,該線程一直處于阻塞當中,根本無法執行其他語句。
此時,就需要調用該線程的interrupt方法,產生一個InterruptedException運行時異常,是阻塞中的那個方法拋出這個異常,從而讓我們有機會結束這個線程的執行。
如:
@Override
????publicvoid?run()?{
while(true){
???????????try?{
//?getSendMessages?是BlockingQueue類。它的take方法將會阻塞!
??????????????responseMessage?=?this.getSendMessages().take();
???????????}?catch?(InterruptedException?e1)?{
???
??????????????thrownew?RuntimeException();
//或者break;
???????????}
???????????someWork();
??????
????}
?
?
????一個外部的Thread?對象?指向這個線程。?需要結束這個線程時,只需要調用thread對象的interrupt()?方法,就會在
responseMessage?=?this.getSendMessages().take();
這條語句中產生一個InterruptedException異常,從而結束該線程的阻塞狀態,通過拋出異常,或者break跳出死循環,結束這個線程。 ———————————————————————————————————————————————————————————————— java線程退出實現方式
http://blog.csdn.net/jiaby008/article/details/6198739
使用Thread.interrupt()中斷線程
??正如Listing?A中所描述的,Thread.interrupt()方法不會中斷一個正在運行的線程。這一方法實際上完成的是,在線程受到阻塞時拋出一個中斷信號,這樣線程就得以退出阻塞的狀態。更確切的說,如果線程被Object.wait,?Thread.join和Thread.sleep三種方法之一阻塞,那么,它將接收到一個中斷異常(InterruptedException),從而提早地終結被阻塞狀態。
????因此,如果線程被上述幾種方法阻塞,正確的停止線程方式是設置共享變量,并調用interrupt()(注意變量應該先設置)。如果線程沒有被阻塞,這時調用interrupt()將不起作用;否則,線程就將得到異常(該線程必須事先預備好處理此狀況),接著逃離阻塞狀態。在任何一種情況中,最后線程都將檢查共享變量然后再停止。
總結
以上是生活随笔為你收集整理的JAVA中断线程的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java6上开发WebService
- 下一篇: 核心API最佳实践——JDK日志分级