[英]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.