Java并发编程---Futrue模式

一.Futrue模式概念

     Futrue模式有点类似于商品订单.比如在网购时,当看中某件商品时,就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可.或者更形象地,我们发送Ajax请求的时候,页面是异步地进行后台处理,用户无须一直等待请求的结果,可以继续浏览或操作其他内容.

                   


二.代码示例

package com.thread.futrue;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
         FutrueClient fc = new FutrueClient();
         Data data = fc.request("请求参赛!");
         System.out.println("请求发送成功!");
         System.out.println("做其他的事情...");
         
         String result = data.getRequest();
         System.out.println(result);
	}

}

package com.thread.futrue;

public class FutrueClient {

	public Data request(final String queryStr){
		//1.我想要一个代理对象(Data接口的实现类),先返回给发送请求的客户端,告诉他请求已经接受到,可以做其他的事情
		final FutrueData futrueData = new FutrueData();
		//2.启动一个新的线程,去加载真实的数据,传递给这个代理对象
		new Thread(new Runnable() {	
			@Override
			public void run() {
				// TODO Auto-generated method stub
				//3.这个新的线程可以慢慢地加载真实对象,然后传递给代理对象(真实的对象加载到方法中)
				RealData realData = new RealData(queryStr);
				futrueData.setRealData(realData);
			}
		}).start();
		
		return futrueData;
	}
}

package com.thread.futrue;

public interface Data {
    String getRequest();
}

package com.thread.futrue;

public class FutrueData implements Data {

	private RealData realData;
	private boolean isReady = false;

	@Override
	public synchronized String getRequest() {
		// TODO Auto-generated method stub
		//如果没装载好,程序就一直处于阻塞状态
		while(!isReady){
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		//装载好直接获取数据即可
		return this.realData.getRequest();
	}

	public synchronized void setRealData(RealData realData){
		//如果已经装载完毕了,就直接返回
		if(isReady){
			return;
		}
		//如果没装载,进行装载真实对象
		this.realData = realData;
		isReady = true;
		//进行通知
		notify();   //通知wait()方法往下走
	}
}

package com.thread.futrue;

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) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("操作完毕,获取结果!");
		result = "查询结果";
	}
	@Override
	public String getRequest() {
		// TODO Auto-generated method stub
		return result;
	}

}

运行结果:

请求发送成功! 做其他的事情... 根据请求参赛!进行查询,这是一个很耗时的操作.. 操作完毕,获取结果! 查询结果

本站公众号
   欢迎关注本站公众号,获取更多程序园信息
开发小院