我经常遇到过这种特殊情况,我想知道"清洁"""清洁"解决它的方法。这一切都是这样的:如何存储对在不同线程中设置的对象的引用?
让我用一个例子说明这一点,假设我有一个名为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请求或任何类型连接的操作来说非常常见。
现在,我的问题是如果我在继续执行之前需要该值,我该如何访问它?我可以使用信号量锁定一个线程,直到我得到我的值,但是值的存储是我不清楚的(如果我声明一个最终变量,则不能再次设置)。我解决了它创建了一个我命名为#34; Pointer"的新类,但我想知道为什么没有任何内置的java类来执行此操作(之前我使用过Vector,但它没有&#t; t似乎也是一个很好的解决方案。)
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这样的类,但看起来他们的目的是不同的东西,而且不存在设置者(他们是只读),这样也无法解决我的问题。
答案 0 :(得分:2)
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);
}
}
答案 1 :(得分:0)
为了省去编写自定义Pointer类的需要,我只想使用AtomicReference。