2014-02-20 3 views
0
class A{ 
    final B; 

    B.compute(); // Does executing this line create a new thread since this returns 
    // a future and the entire function is executed by the same thread ? 


    } 

    class B{ 

    Future<Void> compute(){ 

    C obj = factoryOfC.getC(); 

    ListenableFuture<Void> future = executorService.submit (new Callable(){ 
     doSomething(); 
    }); 

    Futures.addCallback(future, new FutureCallback<Void>(){ 
     @Override 
     void onSuccess(){ 
     } 
     @Override 
     void onFailure(){ 
     } 

    } // end of callback. 
} // end of class B 

Как вы бы описали себя здесь? Какой поток/сек будет выполнять какую часть работы? Будет ли вызов и обратный вызов выполняться в том же потоке?Асинхронное программирование в Java/Guava

WILL obj типа C будет выполняться той же резьбой?

ответ

0

Не только выполнение линии B.compute(); создает новую нить; линия executorService.submit представляет новый CallableExecutorService, который запускается в новом потоке.

1

Вы запустили его, чтобы посмотреть, что он делает? Я сомневаюсь, потому что то, что вы предоставили, не будет компилироваться.

Вы читали JavaDoc для методов, которые вы вызываете? Ответы есть.

Предоставить Callable по номеру ExecutorService.submit(). Документация Executor говорит:

Команда может выполняться в новом потоке, в объединенном потоке или в вызывающего потока, по усмотрению реализации палача

... и документация для ExecutorService не содержит никаких особенностей; что, как программист, все, что вы знаете, это то, что вы просили, чтобы это было запущено в какой-то поток, какое-то время в будущем.

Но у вас есть объект Future, который действует как дескриптор обещанного выполнения вашей задачи. Вы используете Futures.addCallback() для запроса выполнения некоторых работ, когда задача завершается. В каком потоке эта работа будет работать?

JavaDoc для Futures.addCallback() говорит:

  • Если вход Будущее делается в то время addCallback называется, addCallback выполнит обратного вызова в линию.
  • Если вход Будущего еще не сделано, addCallback запланирует обратный вызов для запуска в потоке, который завершает ввод будущего, который может быть внутренний системы потоков, такие как RPC сетевого поток.
+0

Спасибо. Что помогает. Как насчет этого вопроса? WILL obj типа C выполняется одним и тем же потоком? – Phoenix

+0

В вашем коде нет указаний, что 'obj' является Runnable или Callable. Он строится, но с ним ничего не делается. – slim

+0

Это также сильно зависит от реализации 'ExecutorService' у вас есть ... –

Смежные вопросы