gpt4 book ai didi

java - 如何存储对在不同线程中设置的对象的引用?

转载 作者:行者123 更新时间:2023-12-02 05:39:40 25 4
gpt4 key购买 nike

我多次遇到过这种特殊的情况,我想知道解决它的“干净”方法是什么。这一切都归结为:如何存储对在不同线程中设置的对象的引用?

让我用一个例子来说明这一点,假设我有一个名为 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() 方法必须在另一个线程中执行,因此它将通过监听器传达结果,而不是返回值。对于需要 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);
}
}

关于java - 如何存储对在不同线程中设置的对象的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24613350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com