2017-02-26 46 views
0

在Java中,如果某個線程已停止,則無法在不創建新實例的情況下再次啓動該線程。嘗試開始運行時異常的結果,但試圖恢復不。爲什麼?啓動已停止的線程時發生運行時異常,但在恢復時不會出現異常

Thread t1 = new Thread(); 
t1.start(); 
t1.stop(); 
t1.start(); 

這導致例外 -

Exception in thread "main" java.lang.IllegalThreadStateException 
    at java.lang.Thread.start(Thread.java:705) 
    at ThreadEx.main(File.java:12) 

但是我們在使用的簡歷(),而不是開始(),沒有異常發生?當然,沒有什麼可以恢復 - 所以什麼都不會發生 - 但爲什麼沒有例外?

Thread t1 = new Thread(); 
t1.start(); 
t1.stop(); 
t1.resume(); // No exception 
+5

請勿使用'Thread.stop()'或'Thread.resume()'。它們很危險並且被棄用。 [閱讀Javadoc](https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html)。 –

回答

2

這裏是適用於start()resume()方法的javadoc。

這是開始的Javadoc這樣說:

這是從來沒有的法律,以啓動一個線程不止一次。特別是,線程在完成執行後可能不會重新啓動。

因此,當我們啓動線程時,jvm會檢查線程是否已經啓動一次,如果是,則拋出IllegalThreadStateException

現在,讓我們看看簡歷():

如果線程是活的,但暫停使用時,重新開始並允許 做出在其執行進度。

在我們的例子中,線程沒有活着(因爲它已經被停止),因此,resume沒有效果。

而且,按照javadoc中,我們不推薦使用stopsuspendresume方法。 Here的原因。

+1

感謝您的輸入@AndyTurner,我已經更新了答案。 –