2014-02-20 78 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實現...... –