簡體   English   中英

如何存儲對在其他線程中設置的對象的引用?

[英]How can I store a reference to an object that's being set in a different Thread?

我已經多次遇到過這種特殊情況,我想知道解決它的“干凈”方法是什么。 都涉及到這一點:如何存儲對在其他線程中設置的對象的引用?

讓我用一個例子來說明這一點,假設我有一個名為Bar的類,並且從該方法中檢索了該類中的對象:

public class BarBuilder {

    public static void buildNewBar(final BarListener listener) {
        // This could be an HTTP request or something that can only be done in a
        // different thread
        new Thread(new Runnable() {
            @Override
            public void run() {
                listener.onNewBar(new Bar());
            }
        }).start();
    }

}

這里的重要部分是buildNewBar()方法必須在另一個Thread中執行,因此,它不返回值,而是通過偵聽器傳遞結果。 對於需要HTTP請求或任何類型的連接的操作,這很常見。

現在,我的問題是在繼續執行之前是否需要該值,我該如何訪問它? 我可以使用信號量鎖定線程,直到獲得我的值為止,但是值的存儲是我不清楚的(如果我聲明了最終變量,則無法再次設置它)。 我解決了這個問題,創建了一個名為“ Pointer”的新類,但是我想知道為什么沒有內置的Java類可以做到這一點(我之前使用過Vector,但它也不是一個好的解決方案)。

public Bar getBar() {
    final Pointer<Bar> barPointer = new Pointer<Bar>();
    final Semaphore semaphore = new Semaphore(0);

    BarBuilder.buildNewBar(new BarListener() {
        @Override
        public void onNewBar(Bar bar) {
            barPointer.set(bar);
            semaphore.release();
        }
    });
    semaphore.acquireUninterruptibly();

    // Now I have my value
    return barPointer.get();
}

public class Pointer<T> {
    T object;

    public void set(T object) {
        this.object = object;
    }

    public T get() {
        return object;
    }
}

讓我們看看Java語言是否支持有更好的方法來執行此操作,我已經看到諸如Reference之類的類,但似乎它們的用途有所不同,並且setter不存在(它們是只讀的),所以不存在。也不能解決我的問題。

public Bar getBar() {
    final BarPointer barPointer = new BarPointer().

    BarBuilder.buildNewBar(barPointer);

    return barPointer.get();
}

public class BarPointer extends FutureTask<Bar> implements BarListener {
    @Override
    public void onNewBar(Bar bar) {
        set(bar);
    }
}

為了消除編寫自定義Pointer類的需要,我只需使用AtomicReference即可

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM