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

时间:2014-07-07 14:44:16

标签: java multithreading pointers asynchronous

我经常遇到过这种特殊情况,我想知道"清洁"""清洁"解决它的方法。这一切都是这样的:如何存储对在不同线程中设置的对象的引用?

让我用一个例子说明这一点,假设我有一个名为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这样的类,但看起来他们的目的是不同的东西,而且不存在设置者(他们是只读),这样也无法解决我的问题。

2 个答案:

答案 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