標籤:多線程 concurrency 線程池 非同步 interface
http://blog.csdn.net/pipisorry/article/details/44341579
Introduction
Callable介面代表一段可以調用並返回結果的代碼;
Future介面表示非同步任務,是還沒有完成的任務給出的未來結果。
所以Callable用於產生結果,Future用於擷取結果。
Callable介面:Java 5在concurrency包中引入了java.util.concurrent.Callable 介面,它和Runnable介面很相似,但它可以返回一個對象或者拋出一個異常。Callable介面使用泛型去定義它的傳回型別。
Executors類:提供了一些有用的方法線上程池中執行Callable內的任務。由於Callable任務是並行的,我們必須等待它返回的結果。
Future對象:java.util.concurrent.Future對象為我們解決了這個問題。線上程池提交Callable任務後返回了一個Future對象,使用它可以知道Callable任務的狀態和得到Callable返回的執行結果。Future提供了get()方法讓我們可以等待Callable結束並擷取它的執行結果。
Callable介面的源碼:
public interface Callable<V> { V call() throws Exception; // 計算結果 }
Future介面的源碼:
public interface Future<V> { boolean cancel(boolean mayInterruptIfRunning);// 試圖取消對此任務的執行 boolean isCancelled(); // 如果在任務正常完成前將其取消,則返回 true boolean isDone(); // 如果任務已完成,則返回 true V get() throws InterruptedException, ExecutionException; // 如有必要,等待計算完成,然後擷取其結果 // 如有必要,最多等待為使計算完成所給定的時間之後,擷取其結果(如果結果可用)。 V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }
一個例子
private ExecutorService executor = Executors.newFixedThreadPool(numberOfThreads);
try {Callable<TopicModel> callable = new TopicModelCallable(corpus,param);Future<TopicModel> future = executor.submit(callable);futureList.add(future);} catch (Exception ex) {ex.printStackTrace();}
for (Future<TopicModel> future : futureList) {TopicModel topicModel = future.get();topicModelList.add(topicModel);}
Note:
1. 用語料和對應參數建立可調用對象callable, 提交給executor並存執行, 結果儲存在future對象中,最後可以用future對象的get()方法提取執行結果
2. ExcutorService介面
ExecutorService提供了管理終止的方法,以及可為跟蹤一個或多個非同步任務執行狀況而產生 Future 的方法。
主要函數:
<T> Future<T> submit(Callable<T> task) 提交一個返回值的任務用於執行,返回一個表示任務的未決結果的 Future。該 Future 的 get 方法在成功完成時將會返回該任務的結果。 如果想立即阻塞任務的等待,則可以使用 result = exec.submit(aCallable).get(); 形式的構造。 註:Executors 類包括了一組方法,可以轉換某些其他常見的類似於閉包的對象, 例如,將 PrivilegedAction 轉換為 Callable 形式,這樣就可以提交它們了。 參數: task - 要提交的任務 返回: 表示任務等待完成的 Future 拋出: RejectedExecutionException - 如果任務無法安排執行 NullPointerException - 如果該任務為 null注意:關於submit的使用和Callable可以參閱《使用Callable返回結果》
[java中Executor、ExecutorService、ThreadPoolExecutor介紹]
from:http://blog.csdn.net/pipisorry/article/details/44341579
ref:http://blog.csdn.net/mazhimazh/article/details/19291965
Java - 多線程Callable、Executors、Future