带线程的异步函数

时间:2013-01-11 20:16:48

标签: java multithreading jvm java-5

我偶然发现了一个对我来说不明确的问题。

  

一个。使用Java 1.4,将以下函数包装在一个线程中,以便可以异步调用它,并提供一种方法,以便稍后检索返回值:

     

B中。如何在Java 5中完成相同的工作

int someMethod(int i) { return i++; }

我认为其中一个解决方案是:使用两种公共方法void synchronized calculate(int i)int getValue()编写一个类。 calculate启动线程并设置私有变量。

在java 1.5中,我可以使用AtomincInteger。这是答案吗?

3 个答案:

答案 0 :(得分:1)

在Java 1.5中,我很确定你会使用Future来返回结果。我不确定1.4等值,但看起来this question涵盖了相同的基础。

答案 1 :(得分:0)

也许您可以在1.5 or later中使用双重检查锁定:

private volatile int privateValue = 0;

public void calculate(int i) {
    int result = getValue(i);
    if (privateValue != result) {
        synchronized (this) {
            if (privateValue != result) {
                privateValue = result;
            }
        }
    }

}

public int getValue(){
    return privateValue;
}

请确保私有值必须声明为volatile

有关double check locking的更多信息。

The "Double-Checked Locking is Broken" Declaration

答案 2 :(得分:0)

calculate()方法将结果放入BlockingQueue queuegetValue()方法调用queue.take(),等待结果尚未计算的情况。

如果可以多次调用getValue()方法,请注意需要额外的编程工作。