java 性能优化读书笔记(四) 并行设计模式

一、Future模式
如果在Client远程调用的时候,Server端需要大量的时间去处理,这时候Server段先返回一个mock的对象让访问完成,Client端并不处理这个数据,而且去执行其他的程序,直到请求返回。
代码如下
1、Main方法

public class Main {

public static void main(String[] args) {

Client client = new Client();

Data data = client.request("name");
System.out.println("request end");
try {
Thread.sleep(2000);
} catch (Exception e) {
}

System.out.println("real data" + data.getResult());
}

}


2、Client端

public class Client {

public Data request(final String string) {
final FuntureData future = new FuntureData();
new Thread() {
@Override
public void run() {
RealDate realData = new RealDate(string);
future.setRealData(realData);
}
}.start();
return future;
}

}

启动一个线程去调用,然后直接返回一个futrue对象。

3、接口

public interface Data {

public String getResult();

}


4、FuntureData

public class FuntureData implements Data {

protected RealDate realDate;

protected boolean isReady;

public synchronized void setRealData(RealDate realData) {
if (isReady) {
return;
}
this.realDate = realData;
isReady = true;
notifyAll();
}

@Override
public synchronized String getResult() {
while (!isReady) {
try {
wait();
} catch (Exception e) {
// TODO: handle exception
}
}
return realDate.getResult();
}

}


Funture 模式的核心。当返回后main使用getResult方法的时候,这个时候真实的数据没有没有完成,这个时候标志位是false。这个时候使用wait()方法。同时Client之前就调用set方法,这个时候如果真实数据加载完成就会把标志位设置为true。同时唤醒进程。所以最好返回的Result就是已经加载好的。

JDK的实现:
1、RealData

public class RealData implements Callable<String> {

private final 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 (Exception e) {
// TODO: handle exception
}
}
return sb.toString();
}

}


实现Callable接口

2、Main

public class Main {

/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
FutureTask<String> future = new FutureTask<String>(new RealData("a"));
ExecutorService es = Executors.newFixedThreadPool(1);
es.submit(future);
System.out.println("request end");
try {
Thread.sleep(2000);
} catch (Exception e) {
}

System.out.println("real data" + future.get());
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值