1. 程式人生 > >java多執行緒Future、FutureTask使用示例,返回非同步的結果

java多執行緒Future、FutureTask使用示例,返回非同步的結果

1、Future、FutureTask介紹

Future是一個介面,該介面用來返回非同步的結果。

FutureTask是一個類,是Future 的一個實現。

2、主要方法

future.get();
或者
future.get(10000, TimeUnit.MILLISECONDS);

獲取多執行緒非同步執行結果,但get方法是一個同步方法,如果未拿到結果或者未超時,主執行緒則一直等待。

future.cancel(boolean flag)

取消當前future任務。

future.isDone() 

判斷當前future是否已經獲取到非同步結果,或者說非同步的多執行緒是否已經執行完成並返回結果。

future.isCancelled()

判斷當前future獲取非同步結果的任務是否被取消。

3、使用場景

從遠端獲取資料的計算結果,需要一定的時間,並且後面的程式碼與該資料暫時沒有關係,直到最後才會使用該資料。

呼叫非同步函式之後立馬返回,主執行緒繼續向下執行,等需要使用非同步執行緒的資料的時候,再來呼叫獲取或者等待獲取該非同步執行緒資料。

4、程式碼示例

package com.test.thread.future;

import java.util.HashMap;
import java.util.concurrent.Callable;
import
java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; /** * @author javaloveiphone * @date 建立時間:2017年2月7日 上午11:33:11 * @Description: */ public class FutureTest { public static void main
(String[] args) throws InterruptedException, ExecutionException { System.out.println("====進入主執行緒執行任務"); //通過執行緒池管理多執行緒 ExecutorService threadPool = Executors.newCachedThreadPool(); //執行緒池提交一個非同步任務 System.out.println("====提交非同步任務"); Future<HashMap<String,String>> future = threadPool.submit(new Callable<HashMap<String,String>>() { @Override public HashMap<String,String> call() throws Exception { System.out.println("非同步任務開始執行...."); Thread.sleep(2000); System.out.println("非同步任務執行完畢,返回執行結果!!!!"); return new HashMap<String,String>(){ {this.put("futureKey", "成功獲取future非同步任務結果");} }; } }); System.out.println("====提交非同步任務之後,立馬返回到主執行緒繼續往下執行"); Thread.sleep(1000); System.out.println("====此時需要獲取上面非同步任務的執行結果"); boolean flag = true; while(flag){ //非同步任務完成並且未被取消,則獲取返回的結果 if(future.isDone() && !future.isCancelled()){ HashMap<String,String> futureResult = future.get(); System.out.println("====非同步任務返回的結果是:"+futureResult.get("futureKey")); flag = false; } } //關閉執行緒池 if(!threadPool.isShutdown()){ threadPool.shutdown(); } } }

執行結果列印情況如下:

====進入主執行緒執行任務
====提交非同步任務
====提交非同步任務之後,立馬返回到主執行緒繼續往下執行
非同步任務開始執行....
====此時需要獲取上面非同步任務的執行結果
非同步任務執行完畢,返回執行結果!!!!
====非同步任務返回的結果是:成功獲取future非同步任務結果

5、FutureTask 類

因為FutureTask 類是 Future 的一個實現,Future 可實現 Runnable,所以可通過 threadPool 來執行。例如,可用下列內容替換上面帶有 submit 的構造(為簡化,返回String型別):

FutureTask<String> future = new FutureTask<String>(new Callable<String>() {
    public String call() {
        return "成功獲取future非同步任務結果";
    }
});

threadPool.execute(future);