一、Future模式
Futrue模式:对于多线程,如果线程A要等待线程B的结果,那么线程A没必要等待B,直到B有结果,可以先拿到一个未来的Future,等B有结果是再取真实的结果。
二、Future模式Demo
公共的数据接口,真实数据和未来数据都要实现该接口
package ConcurrentProgramming.middle.part3.Future; / * @Author: zdj * @Description: 公共数据接口 FutureData 和 RealData都要实现 * @Date: 2019年03月14日 14:54 */ public interface Data { String getRequest(); }
讯享网
FutureData,未来数据。客户端发出请求时,直接响应该对象,通知客户端请求已经接受到,正在处理。
讯享网package ConcurrentProgramming.middle.part3.Future; import javax.annotation.Resource; / * @Author: zdj * @Description: 未来数据,客户端发出请求时,直接响应该对象,通知客户端请求已经接受到,正在处理。 * @Date: 2019年03月14日 14:55 */ public class FutureData implements Data { private RealData realData; / * 用来判断数据是否准备完毕 */ private boolean ready = false; public synchronized void setRealData(RealData realData) { //如果数据准备完毕直接返回 if (ready) { return; } //数据未准备,则装载数据 this.realData = realData; ready = true; //唤醒阻塞线程 notify(); } public synchronized String getRequest() { //没有准备好数据,阻塞 if (!ready){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //准备好直接返回 return this.realData.getRequest(); } }
真实数据,客户端发出请求后,FutureData未来数据要加载的数据
package ConcurrentProgramming.middle.part3.Future; / * @Author: zdj * @Description: 真实数据,客户端发出请求后,FutureData未来数据要加载的数据 * @Date: 2019年03月14日 14:57 */ public class RealData implements Data { private String result; public RealData(String queryStr){ System.out.println("根据" + queryStr + "进行查询,这是一个很耗时的操作.."); try { Thread.sleep(5000); }catch (Exception e){ e.printStackTrace(); } System.out.println("操作完毕,获取结果。。。"); result = "结果来了"; } public String getRequest() { return result; } }
客户端
讯享网package ConcurrentProgramming.middle.part3.Future; / * @Author: zdj * @Description: 客户端 * @Date: 2019年03月14日 15:27 */ public class FutureClient { public Data request(final String queryStr){ //1、先返回一个空的数据给客户端,告诉客户端请求已经收到,正在获取数据 final FutureData futureData = new FutureData(); //2、启动一个新的线程,去加载真实的数据,获取完毕后,将真实数据返回给客户端 new Thread(new Runnable() { public void run() { RealData realData = new RealData(queryStr); futureData.setRealData(realData); } }).start(); //先返回FutureData,异步加载真实数据 return futureData; } }
测试Main
package ConcurrentProgramming.middle.part3.Future; / * @Author: zdj * @Description: Future模式 先返回给客户端一个空的数据,告诉客户端请求收到, * 异步去加载真实数据。当客户端真正使用数据的时候,返回给客户端真实数据 * 此时如果数据没有加载完毕,则会阻塞线程,直至数据加载完毕。 * @Date: 2019年03月14日 15:31 */ public class Main { public static void main(String[] args) { FutureClient futureClient = new FutureClient(); Data data = futureClient.request("请求参数"); System.out.println("请求发送成功!"); System.out.println("做其他的事情..."); String result = data.getRequest(); System.out.println(result); } }
运行结果

参考链接:https://www.cnblogs.com/plxx/p/4574141.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/30827.html