2015-07-02 143 views
1

如果我們訪問使用stop()方法停止的線程會發生什麼情況。Java多線程停止方法

UserThread t = new UserThread(); 
    t.start(); 
    System.out.println(t.getName()); 
    System.out.println(t.getState()); 
    t.stop(); 
    System.out.println(t.getState()); 

無論如何stop()方法在java8中被棄用,但需要上面的輸出。是否有可能訪問已停止的線程表示處於終止狀態?

在此先感謝。

回答

2

爲什麼不推薦使用Thread.stop?

因爲它本質上是不安全的。停止線程會導致它解鎖所有已鎖定的顯示器。 (由於ThreadDeath異常在堆棧中傳播,所以監視器被解鎖。)如果之前由這些監視器保護的任何對象 處於不一致狀態,則其他線程現在可以以不一致的狀態查看這些對象。據稱這些物體已經損壞。當線程在受損的 對象上運行時,可能導致任意行爲。這種行爲可能是微妙的 難以檢測,或者它可能會發音。不像其他 未經檢查的異常,ThreadDeath靜默殺死線程;因此, 用戶沒有警告他的程序可能會損壞。損壞 可以在實際損壞發生後的任何時間表現出來,甚至在將來 小時或幾天。

應該用什麼來代替Thread.stop?

大部分停止使用應該由簡單的修改一些 變量以指示目標線程應該停止運行的代碼來代替。 目標線程應該定期檢查這個變量,並且如果變量指示它的 要停止運行,則從 有序地返回其運行方法。爲確保及時通知 停止請求,變量必須是易失性的(或者必須對變量 進行同步)。

例如,假設你的小應用程序包含以下啓動,停止和運行方法:

private Thread blinker; 

public void start() { 
    blinker = new Thread(this); 
    blinker.start(); 
} 

public void stop() { 
    blinker.stop(); // UNSAFE! 
} 

public void run() { 
    while (true) { 
     try { 
      Thread.sleep(interval); 
     } catch (InterruptedException e){ 
     } 
     repaint(); 
    } 
} 

您可以通過替換applet的停止和運行方法避免使用使用Thread.stop的: 私人不穩定的線程轉向燈;

public void stop() { 
    blinker = null; 
} 

public void run() { 
    Thread thisThread = Thread.currentThread(); 
    while (blinker == thisThread) { 
     try { 
      Thread.sleep(interval); 
     } catch (InterruptedException e){ 
     } 
     repaint(); 
    } 
} 
0

如果您有興趣看到的是你打電話後線程的狀態stop,你可以通過你的測試類定義之前添加@SuppressWarnings("deprecation")抑制棄用警告。
例如嘗試下面的代碼:

@SuppressWarnings("deprecation") 
class test { 
    public static void main(String[] args) { 
     Thread t = new Thread() { 
     public void run() { 
      while(true) { 
       try { 
        Thread.sleep(1000); 
       }catch(Exception e) {} 
      } 
     } 
     }; 
     t.start(); 
     System.out.println(t.getName()); 
     System.out.println(t.getState()); 
     t.stop(); 
     try { 
     Thread.sleep(1000); // wait for stop to take effect 
     }catch(Exception e) {} 
     System.out.println(t.getState()); 
    } 
} 

劇透:狀態爲TERMINATED

0

其在Thread類勸不使用stop()方法,因爲這已被棄用。

如果要中止線程執行使用中斷()

class IntThread extends Thread{ 
public void run(){ 
try{ 
Thread.sleep(1000); 
System.out.println("Didn't Interrupt me !!!"); 
}catch(InterruptedException e){ 
throw new RuntimeException("Thread interrupted..."+e); 
} 

} 

public static void main(String args[]){ 
IntThread t1=new IntThread(); 
t1.start(); 
try{ 
t1.interrupt(); 
}catch(Exception e){System.out.println("Exception handled "+e);} 

} 
} 

你可以參考link有關中斷的更多細節。