我想了解Callable
在不同的線程上運行時能夠返回一個值。Callable如何在引擎蓋下工作?可調用對象如何返回值?
我在找類Executors
,AbstractExecutorService
,ThreadPoolExecutor
和FutureTask
,全部可在java.util.concurrent
包中找到。
您可以通過調用Executors中的方法(例如newSingleThreadExecutor()
)來創建ExecutorService對象。然後你可以傳遞一個Callable對象ExecutorService.submit(Callable c)
。
由於call()
方法由ExecutorService
提供的線程運行,返回的對象在哪裏跳轉回調用線程?
看這個簡單的例子:
1 ExecutorService executor = Executors.newSingleThreadExecutor();
2 public static void main(String[] args) {
3 Integer i = executor.submit(new Callable<Integer>(){
4 public Integer call() throws Exception {
5 return 10;
6 }
7 }).get();
8 System.out.print("Returns: " + i + " Thread: " + Thread.currentThread.getName());
9 // prints "10 main"
10 }
怎麼可能的是,在呼叫的方法,這是由一個單獨的線程上運行,該整數被返回到整數對象(第3行),因此它可以由主線程(第7行)中的System.out
語句打印?
在ExecutorService
運行其線程之前,主線程不可能運行,因此System.out statement
將打印爲空?
這段代碼有一些編譯錯誤;例如'executor.submit'返回Future,而不是Integer,'currentThread'是需要調用的方法。如果有人關心看到一個工作示例,請參閱http://ideone.com/myoMB – 2012-08-10 14:25:16
對不起,我手動編寫該代碼。 :-)我會看看你的例子。 – Rox 2012-08-10 14:40:11
哦,沒問題,我只是想幫助。這是一個很好的問題。 +1 – 2012-08-10 15:15:42