Java - 多線程Callable、Executors、Future

來源:互聯網
上載者:User

標籤:多線程   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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.