over 4 years ago

在使用Java進行multithreading programming時,常常會想要用
thread.stop()
來結束掉一個thread
但是好景不常,stop早就已經被deprecated啦,請勿再用!
原因是因為當呼叫stop()時,thread被結束掉的地方是無法預期的,可能會造成資料的不一致
那該如何是好?
每個人可能都有自己習慣的做法,我的做法通常都是 Shared Variable搭配interrupt()

  1. Shared Variable
    在run()中利用判斷變數來決定是否該結束自己,簡單的範例程式如下

    Thread th = new Thread() 
    {
        public void run() {
        while(!isStopped){
            //do something...
    
         }
        }
    }
    

    基本上就是利用一個isStopped的變數來控制thread的生殺大權

  2. Interrupt
    那如果thread被block在IO或是Selector時該怎辦?
    因為被block時並沒辦法做check variable的動作,這時候就要靠
    thread.interrupt()
    interrupt()並不會去結束一個thread,而是丟出InterruptedException或是ClosedByInterruptionException
    這時候再到catch中把thread給結束掉

    public void run() {
        while(true) {
         try {
             Thread.sleep(Long.MAX_VALUE);
         } catch (InterruptedException exit) {
             break; //Break out of the loop; ending thread
    
         }
     }
    }
    

別想用外力強迫Thread結束,應該用緩和的方式讓它慢慢死去...

Reference.
[1]http://10kloc.wordpress.com/2013/03/03/java-multithreading-steeplechase-stopping-threads/
[2]https://www.securecoding.cert.org/confluence/display/java/THI05-J.+Do+not+use+Thread.stop+to+terminate+threads()
[3]http://funkie921.blogspot.tw/2009/04/interruptthread.html

← MAC OS X 啟動 Apache與PHP [Linux]Screen 速記 →
 
comments powered by Disqus