亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

創建線程后創建對象與創建線程時傳遞對象

創建線程后創建對象與創建線程時傳遞對象

皈依舞 2021-12-30 17:21:55
創建線程后創建對象(下面的方法 A)與在當前線程中創建對象并將其傳遞給新線程(方法 B)之間有什么區別嗎?方法一:public class AppA {    private A app;    public void run() {        Runnable runnable = () -> {            this.app = new A();        };        Thread workerA = new Thread(runnable);        workerA.start();    }}public class A {    private final EventDispatcher dispatcher;    A() {        this.dispatcher = new EventDispatcher();    }}public static void main(String[] args) {    AppA appA = new AppA();    appA.run();}方法B:public class AppB {    private B app;    public void run() {        EventDispatcher dispatcher = new EventDispatcher();        Runnable runnable = () -> {            this.app = new B(dispatcher);        };        Thread workerB = new Thread(runnable);        workerB.start();    }}public class B {    private final EventDispatcher dispatcher;    B(EventDispatcher dispatcher) {        if (dispatcher == null) {            throw new NullPointerException();        }        this.dispatcher = dispatcher;    }}public static void main(String[] args) {    AppB appB = new AppB();    appB.run();}App 在單線程中創建的對象。app.run() 從單線程調用。
查看完整描述

3 回答

?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

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


查看完整回答
反對 回復 2021-12-30
?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

這主要是一個品味問題。但是在方法中A,您有更好的封裝。如果您不需要訪問線程外的調度程序,則最好內聯創建它。但是,如果您確實需要訪問權限,或者您創建了需要單個調度程序的多個線程,則通過構造函數注入它會更好。

因此:這取決于...


查看完整回答
反對 回復 2021-12-30
?
慕碼人2483693

TA貢獻1860條經驗 獲得超9個贊

在這個例子中,差異純粹是風格上的。但我認為 A 版更好,因為:

  • 版本A更簡單

  • 傳遞給構造函數(在版本 B 中)的對象AppB在您創建它的類中沒有使用/需要......所以版本 B 中的額外復雜性沒有真正的目的。

但是,假設你需要從父線程參數傳遞給子線程通過Runnable,那絕對是好做它的版本B的方式比其他方式。

例如,假設您想從主線程傳遞一個StringBuilder1到子線程:

  • 版本 B 方法不需要執行任何同步來實現傳輸。在父線程中調用 to和子線程中相應調用 to之間有一個happens-before。這確保子線程將看到2Thread.start()Runnable.run()StringBuilder

  • 如果 對Runnable父線程執行回調以獲取在StringBuilder之后由父線程創建的潛在對象start(),則需要使用某種形式的同步;例如同步方法。

  • 如果父線程要StringBuilderstart()調用之后主動傳遞(例如通過在Runnable對象上調用 setter ),那么您需要同步和某種協調;例如,子線程可能需要等待傳遞給它的對象。


1 - 本示例選擇此類,因為它不是線程安全的。

2 - 這假設“主”線程在調用后不會更改緩沖區start()!


查看完整回答
反對 回復 2021-12-30
  • 3 回答
  • 0 關注
  • 217 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號