多線程編程(六)--Callable&Future,callable
Thread類和Runnable介面和Java記憶體管理模型使得多線程編程簡單直接。但是Thread類和Runnable介面都不允許聲明檢查型異常,也不能定義返回值。
Callable介面和Future介面的引入以及它們對線程池的支援優雅的解決了這兩個問題。
Callable介面類似於Runnable介面,Callable介面被線程執行後,可以返回值,這個返回值可以被Future拿到,也就是說,Future可以拿到非同步執行任務的返回值。Future取得的結果類型和Callable返回的結果類型必須一致,這是通過泛型來實現的。
1、Callable要採用ExecutorService的submit方法提交,返回的future對象可以取消任務
代碼:
public static void main(String[] args) {ExecutorService threadPool = Executors.newSingleThreadExecutor();// submit是提交以便返回結果Future<String> future = threadPool.submit(new Callable<String>() {public String call() throws Exception {Thread.sleep(2000);return "hello";};});System.out.println("等待結果");try {System.out.println("拿到結果:" + future.get());} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ExecutionException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
結果:
Executor使我們無需顯示的去管理線程的生命週期。
2、執行多個帶返回值的任務,並取得多個返回值
//方式2 CompletionService用於提交一組Callable任務,其take方法返回已完成的一個Callable任務對應的Future對象//好比我同時種了幾塊地的麥子,然後就等待收割。收割時,則是那塊先成熟了,則先去收割哪塊麥子。ExecutorService threadPool2 = Executors.newFixedThreadPool(10);CompletionService<Integer> compeletionService = new ExecutorCompletionService<Integer>(threadPool2);for (int i = 0; i <= 10; i++) {final int seq = i;compeletionService.submit(new Callable<Integer>() {@Overridepublic Integer call() throws Exception {Thread.sleep(new Random().nextInt(5000));return seq;}});}for (int i = 0; i < 10; i++) {try {//產生線程,返回結果再把結果拿回來System.out.println(compeletionService.take().get());} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ExecutionException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
結果:
3、瞭解Callable介面以及Future介面
Callable介面與Runnable介面的區別
1)Callable定義的方法時call,而Runnable定義的方法是run
2)Callable的call方法可以由返回值,而Runnable的run方法不能有返回值
3)Callable的call方法可以拋異常,而Runnable的run方法不能拋異常
Future表示一步計算的結果,它提供了檢查計算是否完成的方法,以等待計算的完成,並檢索計算的結果。Future的calcel方法可以取消任務的執行,它有一布爾參數,參數為true表示立即終端任務的執行,參數為false表示允許正在啟動並執行任務運行完成。Future的get方法等待計算完成,擷取計算結果。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。