java多執行緒Future、FutureTask使用示例,返回非同步的結果
阿新 • • 發佈:2018-12-29
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);