java多執行緒之Future模式使用
阿新 • • 發佈:2019-01-04
Future模式簡述
- 傳統單執行緒環境下,呼叫函式是同步的,必須等待程式返回結果後,才可進行其他處理。
Futrue模式下,呼叫方式改為非同步。 - Futrue模式的核心在於:充分利用主函式中的等待時間,利用等待時間處理其他任務,充分利用計算機資源。
主要角色
- Main:系統啟動,呼叫Client發出請求
- Client:返回Data物件,立即返回FutureData,並開啟ClientThread執行緒裝配RealData
- Data:返回資料的介面
- FutureData:Futrue資料,是一個虛擬的資料,需要裝配RealData
- RealData:真實資料,構造比較慢。
JDK內建實現
——-jdk中已經內建future模式的實現。其中最重要的事模組是FutrueTask類,它實現了Runnable介面,作為單獨的執行緒執行,在其run() 方法中,通過Sync內部類,呼叫Callable介面,並維護Callable介面的返回物件。使用FutureTask.get()方法,返回Callable介面的返回物件。
具體使用如下:
RealData.java
package com.y.www;
import java.util.concurrent.Callable;
/**
* @description:
* @author: lbYue
* @date : Created in 14:11 2018/1/9
*/
public class RealData implements Callable<String> {
private String para;
public RealData(String para){
this.para = para;
}
@Override
public String call() throws Exception {
//真實的業務邏輯
StringBuffer sb = new StringBuffer();
for (int i= 0 ;i < 10 ; i++){
sb.append(para);
try {
Thread.sleep(100);
}catch (InterruptedException e){
}
}
return sb.toString();
}
}
MainTest.java
package com.y.www;
import java.util.concurrent.*;
/**
* @description:
* @author: lbYue
* @date: Created in 14:15 2018/1/9
*/
public class MainTest {
public static void main(String[] args) throws InterruptedException,ExecutionException{
FutureTask<String> future = new FutureTask<String>(new RealData("a"));
ExecutorService executor = Executors.newFixedThreadPool(1);
executor.submit(future);
System.out.println("請求完畢!");
try {
System.out.println("我在睡覺別打擾我!2秒後迴應");
Thread.sleep(2000);
}catch (InterruptedException e){
}
System.out.println("資料處理完成:"+future.get());
}
}
控制檯輸出結果