асинхронна функция с нишка

Попаднах на въпрос, който не ми е ясен.

A. С помощта на Java 1.4 обвийте следната функция в нишка, така че да може да бъде извикана асинхронно и да предоставите начин за извличане на върнатата стойност по-късно:

B. Как ще бъде направено същото в Java 5

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

Това, което мисля, е едно от решенията: Напишете клас с два публични метода void synchronized calculate(int i) и int getValue(). calculate стартира нишката и задава частна променлива.

В java 1.5 мога да използвам AtomincInteger. Това отговор ли е?


person Lukasz Madon    schedule 11.01.2013    source източник


Отговори (3)


В Java 1.5 съм почти сигурен, че ще използвате Future за връщане на резултата. Не съм сигурен за еквивалента на 1.4, но изглежда, че този въпрос обхваща същото.

person Don Kirkby    schedule 11.01.2013

Може би можете да използвате заключване с двойна проверка в 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;
}

Уверете се, че privateValue трябва да декларирате като volatile.

Повече информация за заключване с двойна проверка.

Декларацията „Заключването с двойна проверка е повредено“.

person lichengwu    schedule 13.01.2013

Нека методът calculate() постави резултата в BlockingQueue queue, а методът getValue() извиква queue.take(), като по този начин изчаква в случай, че резултатът все още не е изчислен.

Обърнете внимание на необходимите допълнителни усилия за програмиране, ако методът getValue() може да бъде извикан няколко пъти.

person Alexei Kaigorodov    schedule 14.01.2013