Calvin's Tech Space

          成于堅忍,毀于浮躁

             :: 首頁 :: 聯系 :: 聚合  :: 管理
          1.不要使用thread.stop()方法。
          2.使用共享變量來檢查是否需要終止線程。
          但是如果線程被阻塞了,它就不可能去主動去檢查變量了,這時要使用thread.interrupt來中斷線程嗎?
          謹慎使用thread.interrupt方法!

          Thread.interrupt()方法不會中斷一個正在運行的線程。這一方法實際上完成的是,在線程受到阻塞時拋出一個中斷信號,這樣線程就得以退出阻塞的狀態(tài)。更確切的說,如果線程被Object.wait, Thread.join和Thread.sleep三種方法之一阻塞,那么,它將接收到一個中斷異常(InterruptedException),從而提早地終結被阻塞狀態(tài)。

          因此,如果線程被上述幾種方法阻塞,正確的停止線程方式時設置共享變量,并調用interrupt()(注意變量應該先設置)。如果線程沒有被阻塞,這時調用interrupt()將不起作用;否則,線程就將得到異常(該線程必須事先預備好處理此狀況),接著逃離阻塞狀態(tài)。在任何一種情況中,線程
          最后都將檢查共享變量然后再停止。


          中斷標志必須是volatile的,以便run方法能夠看到它,否則的話,這個值很有可能在本地有緩存。

          線程代碼為:
           1 public void run() {  
           2     while(running) { 
           4         try {  
           5             // do something may block...

           9         } catch (InterruptedException e) {  
          10             running = false
          12         }  
          13   
          14     }   //while  
          15     //.  
          16 

          需要停止線程時,調用:
          1 running = false;
          2 thread.interrupt();

          注意,一定要先設置標志位后再調用interrupt!

          如果線程因為其他原因阻塞,例如socket.accept(),這時,調用interrupt不會拋出異常,又該如何處理?
          這些情況下,需要分別處理,例如在socket上調用close方法,它將拋出一個SocketException,這與拋出InterruptException類似。

          參考:
          1、http://blog.csdn.net/nihaozhangchao/archive/2010/01/07/5147803.aspx
          2、http://blog.chenlb.com/2009/07/incorrect-use-thread-interrupt-cause-not-exit.html
          posted on 2010-10-29 16:44 calvin 閱讀(684) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 蚌埠市| 开化县| 平昌县| 金塔县| 怀远县| 鄢陵县| 阿荣旗| 阿巴嘎旗| 河池市| 会泽县| 文成县| 安庆市| 兰溪市| 密山市| 阿拉善左旗| 娄底市| 隆安县| 繁昌县| 都安| 宜君县| 湖南省| 吉安市| 鄂温| 饶平县| 肥城市| 定边县| 鹰潭市| 高雄市| 龙门县| 景东| 祁门县| 丽江市| 新宾| 象山县| 五河县| 平原县| 信丰县| 义乌市| 沛县| 闸北区| 乡宁县|