3 回答

TA貢獻1865條經驗 獲得超7個贊
我相信如果您不將相同的對象用于其他用途(可能將其傳遞給不同的線程),則沒有區別。這就像基本的 OOP - 你應該在你將使用它的最窄范圍內定義你的對象。作為一個線程沒有區別。所以如果你想在線程之外使用它 - 在外面創建它。否則在線程中創建它。

TA貢獻1806條經驗 獲得超5個贊
這主要是一個品味問題。但是在方法中A
,您有更好的封裝。如果您不需要訪問線程外的調度程序,則最好內聯創建它。但是,如果您確實需要訪問權限,或者您創建了需要單個調度程序的多個線程,則通過構造函數注入它會更好。
因此:這取決于...

TA貢獻1860條經驗 獲得超9個贊
在這個例子中,差異純粹是風格上的。但我認為 A 版更好,因為:
版本A更簡單
傳遞給構造函數(在版本 B 中)的對象
AppB
在您創建它的類中沒有使用/需要......所以版本 B 中的額外復雜性沒有真正的目的。
但是,假設你需要從父線程參數傳遞給子線程通過了Runnable
,那絕對是好做它的版本B的方式比其他方式。
例如,假設您想從主線程傳遞一個StringBuilder
1到子線程:
版本 B 方法不需要執行任何同步來實現傳輸。在父線程中調用 to和子線程中相應調用 to之間有一個happens-before。這確保子線程將看到2
Thread.start()
Runnable.run()
StringBuilder
如果 對
Runnable
父線程執行回調以獲取在StringBuilder
之后由父線程創建的潛在對象start()
,則需要使用某種形式的同步;例如同步方法。如果父線程要
StringBuilder
在start()
調用之后主動傳遞(例如通過在Runnable
對象上調用 setter ),那么您需要同步和某種協調;例如,子線程可能需要等待傳遞給它的對象。
1 - 本示例選擇此類,因為它不是線程安全的。
2 - 這假設“主”線程在調用后不會更改緩沖區start()
!
添加回答
舉報