睢宁县凌城做网站的,wordpress网页布局,网站建设与管理培训方案,广告公司和设计公司在Java平台,实现异步调用的角色有如下三个角色#xff1a;调用者、 提货单 、真实数据#xff0c;一个调用者在调用耗时操作,不能立即返回数据时,先返回一个提货单 .然后在过一断时间后凭提货单来获取真正的数据.去蛋糕店买蛋糕#xff0c;不需要等蛋糕做出来(假设现做要很长…在Java平台,实现异步调用的角色有如下三个角色调用者、 提货单 、真实数据一个调用者在调用耗时操作,不能立即返回数据时,先返回一个提货单 .然后在过一断时间后凭提货单来获取真正的数据.去蛋糕店买蛋糕不需要等蛋糕做出来(假设现做要很长时间)只需要领个提货单就可以了(去干别的 事情)等到蛋糕做好了再拿提货单取蛋糕就可以了。 [java] view plaincopy print? package com.somnus.async; /** * * Description: 顾客 * author Somnus * date 2016年3月9日 下午7:20:41 * version 1.0 */ public class Customer { public static void main(String[] args) { System.out.println(main BEGIN); CakeShop host new CakeShop(); Cake cake1 host.request(10, A); Cake cake2 host.request(20, B); Cake cake3 host.request(30, C); System.out.println(main otherJob BEGIN); try { Thread.sleep(2000); } catch (InterruptedException e) { } System.out.println(main otherJob END); System.out.println(cake1 cake1.getCake()); System.out.println(cake2 cake2.getCake()); System.out.println(cake3 cake3.getCake()); System.out.println(main END); } } 这里的Customer类就相当于“顾客”CakeShop就相当于“蛋糕店”顾客向“蛋糕店”定蛋糕就相当于“发请求request”返回的数据cake是 DeliveryOrder的实例就相当于提货单而不是真正的“蛋糕”。在过一段时间后(sleep一段时间后)调用data1.getContent()也就是拿提货单获取 执行结果。 下面来看一下顾客定蛋糕后蛋糕店做了什么 [java] view plaincopy print? package com.somnus.async; /** * Description: TODO * author Somnus * date 2016年3月9日 下午7:21:32 * version 1.0 */ public class CakeShop { public Data request(final int count, final char c) { System.out.println(request( count , c ) BEGIN); // (1) 建立DeliveryOrder的实体 final DeliveryOrder order new DeliveryOrder(); // (2) 为了建立RealData的实体启动新的线程 new Thread() { public void run() { //在匿名内部类中使用count、order、c。 CakeBaker cakeBaker new CakeBaker(count, c); order.setCakeBaker(cakeBaker); } }.start(); System.out.println(request( count , c ) END); // (3) 取回FutureData实体作为传回值 return order; } } CakeShop(蛋糕店)在接到请求后先生成了“提货单”DeliveryOrder的实例order然后命令“蛋糕师傅CakeBaker去做蛋糕CakeBaker相当于起 个线程去做蛋糕了。然后host返回给顾客的仅仅是“提货单”future而不是蛋糕。当蛋糕做好后蛋糕师傅才能给对应的“提货单”蛋糕也就 是order.setCakeBaker(cakeBaker);。 下面来看看蛋糕师傅是怎么做蛋糕的 建立一个字符串包含count个c字符为了表现出犯法需要花费一些时间使用了sleep。 [java] view plaincopy print? package com.somnus.async; /** * Description: 蛋糕师傅 * author Somnus * date 2016年3月9日 下午7:22:52 * version 1.0 */ public class CakeBaker implements Cake { private final String cake; public CakeBaker(int count, char c) { System.out.println(making cake( count , c ) BEGIN); char[] buffer new char[count]; for (int i 0; i count; i) { buffer[i] c; try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(making cake( count , c ) END); this.cake new String(buffer); } public String getCake() { return cake; } } 现在来看看“提货单”order是怎么与蛋糕cake对应的: [java] view plaincopy print? package com.somnus.async; /** * Description: 提货单 * author Somnus * date 2016年3月9日 下午7:25:06 * version 1.0 */ public class DeliveryOrder implements Cake { private CakeBaker cakeBaker null; private boolean ready false; public synchronized void setCakeBaker(CakeBaker cakeBaker) { if (ready) { return; // 防止setCakeBaker被调用两次以上。 } this.cakeBaker cakeBaker; this.ready true; notifyAll(); } public synchronized String getCake() { while (!ready) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } return cakeBaker.getCake(); } } 顾客做完自己的事情后会拿着自己的“提货单”来取蛋糕 [html] view plaincopy print? System.out.println(cake1 cake1.getCake()); 这时候如果蛋糕没做好就只好等了 [html] view plaincopy print? while (!ready) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //等做好后才能取到 [html] view plaincopy print? return cakeBaker.getCake(); 程序分析 对于每个请求host都会生成一个线程这个线程负责生成顾客需要的“蛋糕”。在等待一段时间以后如果蛋糕还没有做好顾客还必须等待。 直到“蛋糕被做好”也就是 order.setCakeBaker(cakeBaker);执行以后顾客才能拿走蛋糕。 每个线程只是专门负责制作特定顾客所需要的“蛋糕”。也就是顾客A对应着蛋糕师傅A顾客B对应着蛋糕师傅B。即使顾客B的蛋糕被先做好了 顾客A也只能等待蛋糕师傅A把蛋糕做好。换句话说顾客之间没有竞争关系。 类DeliveryOrder的两个方法被设置为synchronized实际上蛋糕师傅A与顾客A之间的互斥关系也就是顾客A必须等待蛋糕师傅A把蛋糕做好后 才能拿走而与蛋糕师傅B是否做好了蛋糕没有关系。转载于:https://www.cnblogs.com/tuojunjie/p/6836677.html