2012-09-27 55 views
0

我有一臺可調用的,我調用使用如何使Callable等待執行?

FutureTask<Integer> task = new FutureTask<Integer>(new MyCallable(name, type)); 
pool = Executors.newSingleThreadExecutor(); 
pool.submit(task); 

我想知道的是執行繼續pool.submit(task)後或將等待調用完成執行?

總之我只想知道Callable有沒有像thread.join()這樣的方法?

+0

'task.get()'將等待任務完成。這是你在找什麼?當你「提交」時,任務將異步進入由「ExecutorService」管理的線程。 – basiljames

回答

10

...有沒有像Callable的thread.join()方法?

pool.submit(callable)方法返回Future,並且如果線程在池中可用,將立即開始執行。要執行join,可以調用future.get(),該線程將與線程連接,返回call()方法返回的值。重要的是要注意,如果call()方法拋出,get()可能會拋出ExecutionException

您不需要需要將您的Callable換成FutureTask。線程池爲您做到了這一點。所以,你的代碼將是:

pool = Executors.newSingleThreadExecutor(); 
Future<String> future = pool.submit(new MyCallable(name, type)); 

// now you can do something in the foreground as your callable runs in the back 

// when you are ready to get the background task's result you call get() 
// get() waits for the callable to return with the value from call 
// it also may throw an exception if the call() method threw 
String value = future.get(); 

這是,如果你的MyCallable實現,當然Callable<String>Future<?>將匹配您的Callable是什麼類型。

+0

謝謝格雷:你能告訴我Callable拋出什麼類型的異常..? –

+0

你可以看看Javadocs @milind_ensarm。 ExecutionException是不是運行時異常的那個。 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Future.html#get() – Gray

1

task.get()(任務爲FutureTask)期望當前線程等待線程池的完成託管任務。

此方法最終返回一個具體結果或拋出相同的檢查異常(儘管包裝到ExecutionException中),作業線程在其任務期間將拋出異常。