多线程的设计模式:FutureMaster-Worker
Posted zys-blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程的设计模式:FutureMaster-Worker相关的知识,希望对你有一定的参考价值。
一 简介
并行设计模式属于设计优化的一部分,它是对一些常用的多线程结构的总结和抽象。与串行程序相比,并行程序的结构通常更为复杂,因此合理的使用并行模式在多线程开发中更具有意义,在这里主要介绍==Future==、==Master-Worker==和==生产者-消费者==模型
二 Future模式
Future模式有点类似于商品订单。比如在网购时,当看中某一件商品时,就可以提交订单,当订单处理完成后,在家等待商品送货上门即可。或者说更形象的,我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无需一直等待请求的结果,可以继续浏览或操作其他内容。
public class Main {
public static void main(String[] args) {
FutureClient futureClient = new FutureClient();
Date date = futureClient.request("date");
System.out.println("请求已经被处理...");
System.out.println("去做其他操作...");
System.out.println("结果为:" + date.getRequest());
}
}
public class FutureClient {
public Date request(final String queryStr) {
//1.想要一个代理对象(Date接口的实现类)先返回给发送请求的客户端,告诉她请求已经被接收到,可以做其他事情
final FutureDate futureDate = new FutureDate();
//2.启动一个新的线程,去加载真实数据,传递给这个代理对象
new Thread(new Runnable() {
@Override
public void run() {
//3.这个新的线程可以去加载真实对象,然后传递给代理对象
RealDate realDate = new RealDate(queryStr);
futureDate.setRealDate(realDate);
}
}).start();;
return futureDate;
}
}
public interface Date {
String getRequest();
}
public class FutureDate implements Date{
private RealDate realDate;
private Boolean isReady = false;
@Override
public synchronized String getRequest() {
while (!isReady) {
try {
//如果没有装载完毕,程序一直处于阻塞状态
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//装载好直接获取数据
return this.realDate.getRequest();
}
public synchronized void setRealDate(RealDate realDate) {
while (isReady) {
//如果已经加载完毕,就直接返回
return;
}
//如果没有,就进行装载真实对象
this.realDate = realDate;
this.isReady = true;
//通知
notify();
}
}
public class RealDate implements Date{
private String realDate;
public RealDate(String realDate) {
System.out.println("根据" + realDate + "进行查询,这是一个很耗时的操作...");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("操作完毕,获取结果...");
this.realDate = "查询结果";
}
@Override
public String getRequest() {
// TODO Auto-generated method stub
return this.realDate;
}
}
运行结果:
请求已经被处理...
去做其他操作...
根据date进行查询,这是一个很耗时的操作...
操作完毕,获取结果...
结果为:查询结果
三 Master-Worker模式
以上是关于多线程的设计模式:FutureMaster-Worker的主要内容,如果未能解决你的问题,请参考以下文章