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

标签 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() 方法必须在另一个线程中执行,因此它将通过监听器传达结果,而不是返回值。对于需要 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/

相关文章:

c - 无法将数组从另一个函数返回到主函数

c - 指向整数数组的指针在 C 中如何工作?

java - 在java中声明一个 boolean 方法

java - 究竟是什么导致了这个 NullPointerException?

c# - 在另一个线程中从数据库中检索数据(Unity3D)

java - 线程循环卡住游戏窗口

java - java 新手 - 需要了解一个对象如何接收 2 个不同的返回值

ubuntu 中的 JAVA_HOME 默认值

swift - 在 DispatchQueue.main.async 上运行代码是否较慢?

c - 为什么将指向字符串的指针传递给函数时是 2 星