多线程开发可以更好的发挥多核cpu性能,常用的多线程设计模式有:Future、Master-Worker、Guard Susperionsion、不变、生产者-消费者 模式;
jdk除了定义了若干并发的数据结构,也内置了多线程框架和各种线程池; 锁(分为内部锁、重入锁、读写锁)、ThreadLocal、
信号量等在并发控制中发挥着巨大的作用。这里重点介绍第一种并发——Future模型。
一、什么是Future模型:
该模型是将异步请求和代理模式联合的模型产物。类似商品订单模型。见下图:
客户端发送一个长时间的请求,服务端不需等待该数据处理完成便立即返回一个伪造的代理数据(相当于商品订单,不是商品本身),用户也无需等待,先去执行其他的若干操作后,再去调用服务器已经完成组装的真实数据。该模型充分利用了等待的时间片段。
二、Future模式的核心结构:
(1)Main函数:
public class Main { public static void main(String[] args){ Client client = new Client(); //理解返回一个FutureData Data data = client.request("name"); System.out.println("请求完毕!"); try{ //处理其他业务 //这个过程中,真是数据RealData组装完成,重复利用等待时间 Thread.sleep(2000); }catch (Exception e){ } //真实数据 System.out.println("数据 = "+ data.getResult()); } }
Client的实现:
public class Client { public Data request(final String queryStr){ final FutureData future = new FutureData(); //开启一个新的线程来构造真实数据 new Thread(){ public void run(){ RealData realData = new RealData(queryStr); future.setRealData(realData); } }.start(); return future; } }
Data的实现:
public interface Data { public String getResult(); }
FutureData:
/** * 是对RealData的一个包装 * @author limin * */ public class FutureData implements Data { protected RealData realData =null; protected boolean isReady = false; public synchronized void setRealData(RealData realData){ if(isReady){ return; } this.realData=realData; isReady=true; notifyAll(); } @Override public synchronized String getResult() { while(!isReady){ try{ wait(); }catch (Exception e){ } } return realData.result; } }
RealData实现:
public class RealData implements Data { protected String result; public RealData(String para){ //构造比较慢 StringBuffer sb= new StringBuffer(); for(int i=0;i<10;i++){ sb.append(para); try{ Thread.sleep(1000); }catch(Exception e){ } result= sb.toString(); } } @Override public String getResult() { return result; } }
注意:
FutureData是对RealData的包装,是dui真实数据的一个代理,封装了获取真实数据的等待过程。它们都实现了共同的接口,所以,针对客户端程序组是没有区别的;
客户端在调用的方法中,单独启用一个线程来完成真实数据的组织,这对调用客户端的main函数式封闭的;
因为咋FutureData中的notifyAll和wait函数,主程序会等待组装完成后再会继续主进程,也就是如果没有组装完成,main函数会一直等待。