并行设计模式属于设计的优化部分,它是对一些常用的多线程结构的总结和抽象,与串行程序相比,并行程序的结构通常更为复杂,因此合理的使用并行开发模式在多线程开发中更具有意义,这里主要介绍:future、Master-Work和生产者-消费者模型。
1 future 模式
类似于Ajax 的异步通信,
示例代码:
public class Main {
public static void main(String[] args){
FutureClient fc = new FutureClient();
Data data = fc.request("请求参数");
System.out.println("请求发送成功!");
System.out.println("做其他事情....");
String result = data.getRequest();
System.out.println(result);
}
}
================================
public interface Data {
String getRequest(); } =====================================public class FutureClient {
public Data request(final String queryStr){ //1.我想要一个代理对象(Data 接口的实现类) 先返回给发送请求的客户端,告诉他请求已经接收到,可以做其他事情 final FutureData futureData = new FutureData(); //2. 启动一个新的线程,去加载真实的数据 new Thread(new Runnable(){ public void run(){ //3 这个新的线程可以去慢慢的加载真实的对象,然后传递给代理对象 RealData realData = new RealData(queryStr); futureData.setRealData(realData); } }).start(); return futureData; }}
====================================================
public class FutureData implements Data{
private RealData realData; private boolean isReady = false;public synchronized void setRealData(RealData realData) {
// TODO Auto-generated method stub //如果已经装载完毕了,就直接返回 if(isReady){ return; } //如果没有装载,进行装载真实对象 this.realData = realData; isReady = true; //进行通知 notify(); }public synchronized String getRequest() {
// TODO Auto-generated method stub //如果没有装载好,程序就一直处于阻塞状态 while(!isReady) try{ wait(); }catch(InterruptedException e){ e.printStackTrace(); } //装载好 直接获取数据 return this.realData.getRequest(); }}
===========================================public class RealData implements Data{
private String result;public RealData(String queryStr) {
// TODO Auto-generated constructor stub System.out.println("根据"+queryStr+"进行查询,这是一个很耗时的操作..."); try{ Thread.sleep(5000); }catch(InterruptedException e){ e.printStackTrace(); } System.out.println("操作完毕,获取结果"); result ="查询结果"; }public String getRequest() {
// TODO Auto-generated method stub return result; }}
======================================2 Master-Work 是常用的并行计算模式,它的核心思想是系统有两类进程协作工作:Master 进程和Worker进程。Master 负责接收和分配任务,Worker 负责处理子任务。当各个Worker 子进程处理完成后,会将结果返回给Master,由Master做归纳和总结。其好处是能将一个大任务分解成若干个小任务,并行执行,从而提高系统的吞吐量。