future模式

1
2
3
4
5
6
7
package concurrent.future;

public interface <T> {

public T getResult();

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package concurrent.future;

public class RealData<T> implements <T> {

private T result;


public T getResult() {
return result;
}

public RealData(T pram) {
super();
StringBuilder sb = new StringBuilder();
for (int i = 0; i <= 10; i++) {
sb.append(pram + " " + i + " ");
try {
Thread.sleep(1 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
result = (T) sb.toString();
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package concurrent.future;

public class FutureData<T> implements <T> {

boolean isReady = false;

private RealData<T> realData = null;


public synchronized T getResult() {
System.out.println("进入 FutureData getResult");
while (!isReady) {
try {
wait();
} catch (InterruptedException e) {

e.printStackTrace();
}
}
System.out.println("FutureData getResult 已经有数据");
return realData.getResult();
}

public synchronized void setRealData(RealData<T> realData) {
if (isReady) {
return;
}
this.realData = realData;
this.isReady = true;
notifyAll();
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package concurrent.future;

import org.apache.poi.ss.formula.functions.T;

@SuppressWarnings("hiding")
public class Client<T> {

public Data<T> request(final T queryStr) {
final FutureData<T> futureData = new FutureData<T>();
new Thread() {
public void run() {
RealData<T> realData = new RealData<T>(queryStr);
futureData.setRealData(realData);
}

}.start();
return futureData;
}

public static void main(String[] args) {
Client<String> client = new Client<String>();
Data<String> data = client.request(" lee is good");
System.out.println(System.currentTimeMillis() + " 请求完毕 ");
String result = data.getResult();
System.out.println(System.currentTimeMillis() + " 结果 " + result);
}
}

JDK中的Future模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package concurrent.future;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

public class RealData2 implements Callable<String> {

String pram;

public RealData2(String pram) {
super();
this.pram = pram;
}


public String call() throws Exception {
// TODO Auto-generated method stub
StringBuilder sb = new StringBuilder();
for (int i = 0; i <= 10; i++) {
sb.append(pram + " " + i + " ");
try {
Thread.sleep(1 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return sb.toString();
}

public static void main(String[] args) throws InterruptedException, ExecutionException {
RealData2 data = new RealData2(" lee is good");
FutureTask<String> task = new FutureTask<String>(data);
ExecutorService service = Executors.newSingleThreadExecutor();
service.submit(task);
System.out.println(System.currentTimeMillis() + " 请求完毕 ");
String result = task.get();
System.out.println(System.currentTimeMillis() + " 结果 " + result);
service.shutdown();
}
}