`
donald3003a
  • 浏览: 64165 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论
  • 淼淼E馒头: 这举列有点不恰当啊。。电影人和不同类型的电影。是两个不同概念 ...
    合成模式

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());
	}

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics