Ожидание обратного вызова в Callable

Я хочу сделать что-то вроде этого:

public class MyCallable implements Callable<Boolean>, MyObserver
{
    Boolean mSuccess = false;

    @Override
    public Boolean call() throws Exception
    {
        // ... Wait here until myCallback is called ...

        return mSuccess;
    }

    @Override
    public void myCallback()
    {
        if(something) mSuccess = true;
    }
}

поэтому я могу использовать его как:

MyCallable callable = new MyCallable();

FutureTask<Boolean> futureTask = new FutureTask<Boolean>(callable);

ExecutorService executor = Executors.newFixedThreadPool(1);
executor.execute(futureTask);

Boolean successfull = futureTask.get();

Как будет выглядеть этот код «Дождитесь вызова обратного вызова»? Я думаю, я мог бы просто создать член с именем «Boolean mCallbackCalled = false» и просто пока (! mCallbackCalled), но это кажется довольно хакерским...


person David Doria    schedule 21.10.2013    source источник
comment
Рассмотрите возможность использования CountDownLatch, но это не похоже на подходящий дизайн.   -  person Sotirios Delimanolis    schedule 21.10.2013
comment
Возможно, BlockingQueue? Тоже не кажется уместным.   -  person Meesh    schedule 21.10.2013


Ответы (1)


Вы вообще не должны использовать исполнителей.

Вместо этого создайте CountDownLatch с число 1, countDown() в обратном вызове, затем await() в коде вызова.

person SLaks    schedule 21.10.2013
comment
@SLacks Я не думаю, что есть простой способ установить тайм-аут для CountDownLatch? То есть ждать, пока произойдет отсчет, но если его не будет через 5 секунд, все равно продолжить? - person David Doria; 22.10.2013
comment
Извините, я слишком поторопился с триггером: stackoverflow.com/questions/15245629/ . Спасибо за указатель! - person David Doria; 22.10.2013