在我認爲,實例教學比理論教學更加容易理解,並且理論知識網上一大堆,這裏就不重複了,所以記錄下Future模式的一種實現例子,以備以後可以查看。
如果不太懂Future模式時幹什麼的,最好先普及下理論知識再來看更好。
好,現在我們就開始來講解分析我的例子:
首先需要定義的就是輸入和輸出參數的格式,這裏簡單的創建了一個如下:
public class Result {
private String result;
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
}
public class Task {
private int id ;
private String requestinfo;
public Task(int id, String requestinfo) {
this.id = id;
this.requestinfo = requestinfo;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getRequestinfo() {
return requestinfo;
}
public void setRequestinfo(String requestinfo) {
this.requestinfo = requestinfo;
}
}
好,定義完了輸入和輸出參數類型,現在開始定義數據類型Data接口:
public interface Data {
Result getRequestinfo();
}
很簡單的一個接口,下面定義一個FutureData和RealData分別實現Data接口並處理
public class FutureData implements Data{
// FutureData這個類只是一個裝飾,實際調用的還是RealData
private RealData realData;
// 用來控制RealData是否賦值完
private boolean isReady = false;
// 實現一個setRealData方法,用來賦值,並且實現線程間的通信
public synchronized void setRealData(RealData realData){
if (isReady){
return;
}
this.realData = realData;
isReady=true;
notify();
}
// 實際調用的時RealData的方法,wait()是爲了等待賦值完成
@Override
public synchronized Result getRequestinfo() {
while (!isReady){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return this.realData.getRequestinfo();
}
}
public class RealData implements Data{
Result result = new Result();
public RealData(Task task){
System.out.println("開始處理任務,請稍後");
try {
// 模擬處理時間
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 這裏處理就是簡單的把參數內容傳進來,複雜處理可以進一步擴展
result.setResultdata(task.getRequestinfo());
}
@Override
public Result getRequestinfo() {
return this.result;
}
}
現在就需要提供一個對外部的接口可以來調用,我們設爲FutureClient
public class FutureClient {
// 注意這裏的參數需要爲final
public Data request(final Task task){
final FutureData futureData = new FutureData();
new Thread(new Runnable() {
@Override
public void run() {
RealData realData = new RealData(task);
futureData.setRealData(realData);
}
}).start();
return futureData;
}
}
現在我們就可以在Main函數中調用了
public class Main {
public static void main(String[] args) {
Task task = new Task(1,"傳入參數");
Data data = new FutureClient().request(task);
System.out.println("參數已傳入");
System.out.println("傳入參數爲:"+data.getRequestinfo().getResultdata());
}
}
結果爲
到這裏我們整個Future模式就完成了,當然JDK底層也提供了Future,以後可以直接使用。