2010-10-26 29 views
7

有沒有人有任何洞察Java Thread類run()方法公開的歷史?幾乎所有的時候,它都會被重寫使用,因此受保護的修飾符會更合適嗎?這仍然將start()作爲用戶的公共api離開,因此不會爲用戶意外調用run()而留下任何錯誤空間。公共修飾符在Java線程運行的好處()

回答

10

Thread implements Runnable,它定義了run()方法,所以它必須公開。

但是由於Java 1.5建議使用Executors services而不是java.lang.Thread。執行者將要執行的工作單元(Runnable,Callable)與實際執行者分離。 (與Thread它們是相同的東西)

+0

是的,你是對的,我會認爲這就是爲什麼run()在那裏作爲一個公共方法。事實上,由於有一個構造函數需要一個Runnable參數 - public Thread(Runnable target),它應該否定實現Runnable的必要性? – gshx 2010-10-26 17:20:53

+0

它「不可取」?而不是相反? :-) – 2010-10-26 17:26:37

+0

謝謝。一個額外的'不':)被刪除。 – Bozho 2010-10-26 17:27:09

2

run定義在Runnable接口中,並且接口中定義的所有方法都是公共的。

+0

謝謝,但我應該詳細闡述一些在我的問題 - 線程真的需要實現Runnable時,它完成其注入的Runnable目標裏面的所有工作? – gshx 2010-10-26 17:42:30

3

你最好不要重寫Thread,你應該創建一個Runnable並將它傳遞給新線程的構造函數。這樣,正在完成的工作,Runnable,與實現機制Thread保持分離。

+0

Nathan,我同意你的看法,這就是爲什麼我想知道爲什麼它首先出現 - 當Thread類已經有一個接受Runnable的構造函數時,Thread實現Runnable的作用是什麼,它覆蓋了run() – gshx 2010-10-26 17:29:00

+0

@gshx :好問題,我的猜測是它提供了一條捷徑。 – 2010-10-26 18:00:42

1

我認爲這基本上是一個糟糕的設計,爲了使用戶「簡單」,允許將任務運行(Runnable)與線程直接運行。由於Thread是在JDK 1.0中添加的,但從那時起,該設計一直無法更改,因此只是棄用(有點)而不贊成使用Executor框架。 JDK 1.0是很久以前的事了,從那時起,沒有經驗的好處就犯了各種各樣的錯誤。

+0

我實際上贊成廢棄Thread上的run(),而是建議使用executors。現在顯然不可能保護它。 – gshx 2010-10-26 18:10:44