定義:
獲取Future角色的線程會在稍後使用Future角色來獲得運行的結果。
引例:
名字 | 說明 |
main | 向host發出請求並獲取數據 |
data | 表示訪問數據方法的接口。 |
host | 向請求返回futuredata實例的類 |
futuredata | 表示提貨帶類 |
realdata | 表示真實數據 |
public class Main {
public static void main(String[] args) {
System.out.println("main BEGIN");
Host host = new Host();
Data data1 = host.request(10, 'A');
Data data2 = host.request(20, 'B');
Data data3 = host.request(30, 'C');
System.out.println("main otherJob BEGIN");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
System.out.println("main otherJob END");
System.out.println("data1 = " + data1.getContent());
System.out.println("data2 = " + data2.getContent());
System.out.println("data3 = " + data3.getContent());
System.out.println("main END");
}
}
public interface Data {
public abstract String getContent();
}
public class FutureData implements Data {
private RealData realdata = null;
private boolean ready = false;
public synchronized void setRealData(RealData realdata) {
if (ready) {
return; // balk
}
this.realdata = realdata;
this.ready = true;
notifyAll();
}
public synchronized String getContent() {
while (!ready) {
try {
wait();
} catch (InterruptedException e) {
}
}
return realdata.getContent();
}
}
public class RealData implements Data {
private final String content;
public RealData(int count, char c) {
System.out.println(" making RealData(" + count + ", " + c + ") BEGIN");
char[] buffer = new char[count];
for (int i = 0; i < count; i++) {
buffer[i] = c;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
System.out.println(" making RealData(" + count + ", " + c + ") END");
this.content = new String(buffer);
}
public String getContent() {
return content;
}
}
public class Host {
public Data request(final int count, final char c) {
System.out.println(" request(" + count + ", " + c + ") BEGIN");
// (1) 建立FutureData的實體
final FutureData future = new FutureData();
// (2) 爲了建立RealData的實體,啓動新的線程
new Thread() {
public void run() {
RealData realdata = new RealData(count, c);
future.setRealData(realdata);
}
}.start();
System.out.println(" request(" + count + ", " + c + ") END");
// (3) 取回FutureData實體,作爲傳回值
return future;
}
}
main BEGIN
request(10, A) BEGIN
request(10, A) END
request(20, B) BEGIN
request(20, B) END
request(30, C) BEGIN
request(30, C) END
main otherJob BEGIN
making RealData(10, A) BEGIN
making RealData(30, C) BEGIN
making RealData(20, B) BEGIN
making RealData(10, A) END
main otherJob END
data1 = AAAAAAAAAA
making RealData(20, B) END
data2 = BBBBBBBBBBBBBBBBBBBB
Future模式出現的角色:
client(請求者):client向host發出請求request,並立刻接收一個處理結果(虛擬數據)
host:host角色會創建新的線程,並開始在新的新的線程中創建realdara角色。
virtualdata(虛擬數據):virtualdata角色是讓future角色與realdata角色具有一致性的角色。
realdata(真實數據):realdata角色表示真實的角色,創建該對象會花費很多時間。
future(期貨):future角色是“提貨帶”,由host角色傳遞給client角色。