2014-02-20 116 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中的异步编程

将C类型的obj由相同的线程执行?

回答

0

不是单独执行行B.compute();就创建了一个新的线程;该行executorService.submit向在新线程中运行的ExecutorService提交新的Callable

1

你运行它看看它做了什么?我对此表示怀疑,因为你提供的内容不会被编译。

你读过你调用的方法的JavaDoc吗?答案就在那里。您提交CallableExecutorService.submit()。为Executor文档说:

该命令可以在一个新的线程中执行,在一个线程池,或在 调用线程,在Executor实现

的自由裁量权和... ExecutorService的文档没有增加细节;这意味着作为一名程序员,你所知道的是,你已经要求它在某个线程中运行,在未来的某个时间。

但是,您有一个Future对象,它充当您承诺的任务执行的句柄。您使用Futures.addCallback()要求在任务完成时执行一些工作。这项工作将在什么样的线程中运行?

的Javadoc Futures.addCallback()说:

  • 如果输入的未来在时间的addCallback完成被调用时, 的addCallback将执行回调在线。
  • 如果未输入Future是 尚未完成,则addCallback将安排回调由完成输入Future的 线程运行,该线程可能是内部的 系统线程,例如RPC网络线程。
+0

谢谢。这有帮助。这个问题呢? C类型的obj是由同一个线程执行的吗? – Phoenix

+0

你的代码中没有迹象表明'obj'是一个Runnable或Callable。它被构建,但没有其他任何事情可以做到。 – slim

+0

它也很大程度上取决于你的ExecutorService实现...... –