Java中的Future模式原理自定义实现

  • 摘要:Future模式类似于js中的ajax等,是一个异步获取数据的机制,这里我把自己的一些形象理解通过代码实现了一下。该机制可以形象的理解为:调用获取数据的方法,首先获得一个没有装数据的空箱子(这个箱子有获取数据和装载数据的机制),至于箱子中的数据是通过另开一个线程去获取的,隔一段时间之后,当我们想要获取箱子中的数据的时候,就直接从箱子中拿就行了,一般情况下,由于获取到箱子之后到我需要从箱子中拿取数据应该已经过了一段时间(因为做其他一些操作),正是这一段时间,数据通过其它线程已经
  • Future模式类似于js中的ajax等,是一个异步获取数据的机制,这里我把自己的一些形象理解通过代码实现了一下。

    该机制可以形象的理解为:调用获取数据的方法,首先获得一个没有装数据的空箱子(这个箱子有获取数据和装载数据的机制),至于箱子中的数据是通过另开一个线程去获取的,隔一段时间之后,当我们想要获取箱子中的数据的时候,就直接从箱子中拿就行了,一般情况下,由于获取到箱子之后到我需要从箱子中拿取数据应该已经过了一段时间(因为做其他一些操作),正是这一段时间,数据通过其它线程已经被存放到箱子中了。

    /**
     * 测试
     * @author yangcheng
     *
     */
    public class MainTest {
    	public static void main(String[] args){
    		Client client=new Client();
    		//拿到空箱子箱子
    		FeatureCar result=(FeatureCar) client.requestData("这是我发送的数据");
    		System.out.println("继续执行其他业务");
    		//从空箱子中获取数据 如果数据没有则等待,一直等到拿到数据位置————因此 在获取箱子中的数据之前可以做一些其它操作
    		System.out.println(result.getResult());
    	}
    
    }
    /**
     * 客户端中,使用近似于javascript中的ajax的异步请求数据的这种方式获取数据
     *
     * 该客户端作用  需要构建异步数据获取的结构,以便让main方法直接使用该类对象获取其数据
     *
     * @author yangcheng
     *
     */
    public class Client {
    	//
    	public Data requestData(final String msg){
    		//创建一个同步对象直接返回(盛放物品的箱子)
    		final FeatureCar car=new FeatureCar();
    
    		//创建一个线程 用于获取数据(获取箱子中的物品,这个物品是在把箱子已经交给请求者之后,慢慢放进箱子中的)
    		new Thread(new Runnable() {
    
    			@Override
    			public void run() {
    				// TODO Auto-generated method stub
    				FeatureRealData realData=new FeatureRealData(msg);
    				//把真实的数据放到箱子里面
    				car.setRealData(realData);
    			}
    		}).start();;
    		//把箱子先返回给调用者  而里面的数据是通过上面的线程异步放进去的
    		return car;
    	}
    }
    /**
     * 箱子
     * 用于同步返回客户端请求的数据(装东西的“箱子”,刚刚返回给调用者时箱子是空的,里面的数据是通过异步线程获取的)
     *
     * @author yangcheng
     *
     */
    public class FeatureCar implements Data{
    	//组合一个真实数据对象
    	private FeatureRealData realData;
    	//这里需要设置一个标识用于判断realData对象中是否为null,如果为null的时候getResult方法被执行,就需要把getResult阻塞(wait())
    	//默认没有值
    	private boolean flag=false;
    	public synchronized void setRealData(FeatureRealData realData) {
    		if(flag){
    			try {
    				//如果在非synchronized方法中调用方法 wait notify notifyAll  会报"java.lang.IllegalMonitorStateException"
    				wait();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    		//默认setRealData方法可以直接执行 不会阻塞,
    		flag=true;
    		notify();
    		this.realData = realData;
    
    	}
    
    	@Override
    	public synchronized String getResult() {
    		// TODO Auto-generated method stub
    		while(true){
    			if (!flag) {
    				try {
    					//当realData对象为null 线程等待
    					System.err.println("**************************");
    					wait();
    
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    			notify();
    			return realData.getResult();
    		}
    
    	}
    
    }
    /**
     * 被装到箱子里面的“物品”
     *
     * 该类的作用就是  访问数据库  并将结果返回
     * @author yangcheng
     *
     */
    public class FeatureRealData implements Data{
    	private String resultData;
    
    	//模拟访问数据库
    	public	FeatureRealData(String msg){
    		try {
    			//模拟数据库访问花了3秒
    			Thread.sleep(3000);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		resultData= "返回的真实数据:数据获取成功!";
    
    	}
    	//将查询结果返回
    	@Override
    	public String getResult() {
    		// TODO Auto-generated method stub
    		return resultData;
    	}
    
    }
    /**
     * 该接口用于规范获取数据的方法
     * @author yangcheng
     *
     */
    public interface Data {
    	public String getResult();
    }

from: https://www.aliyun.com/jiaocheng/1337978.html

原文地址:https://www.cnblogs.com/GarfieldEr007/p/10166286.html

时间: 2024-10-25 21:03:10

Java中的Future模式原理自定义实现的相关文章

14.Java中的Future模式

jdk1.7.0_79  本文实际上是对上文<13.ThreadPoolExecutor线程池之submit方法>的一个延续或者一个补充.在上文中提到的submit方法里出现了FutureTask,这不得不停止脚步将方向转向Java的Future模式. Future是并发编程中的一种设计模式,对于多线程来说,线程A需要等待线程B的结果,它没必要一直等待B,可以先拿到一个未来的Future,等B有了结果后再取真实的结果. ExecutorService executor = Executors.

java中的工厂模式

java中的工厂模式,个人理解是:要想制作一个汽车,则必须有轮子,发动机,座椅等. 1.创建一个接口,并且使得轮子,发动机,座椅三个实现类实现这个接口. 2.创建一个工厂,生成基于给定信息的实体类的对象. 1 public class 零件工厂{ 2 3 4 public Shape 获得零件(String 零件名称){ 5 if(零件名称== null){ 6 return null; 7 } 8 if(零件名称.equalsIgnoreCase("轮子")){ 9 return n

从虚拟机指令执行的角度分析JAVA中多态的实现原理

从虚拟机指令执行的角度分析JAVA中多态的实现原理 前几天突然被一个"家伙"问了几个问题,其中一个是:JAVA中的多态的实现原理是什么? 我一想,这肯定不是从语法的角度来阐释多态吧,隐隐约约地记得是与Class文件格式中的方法表有关,但是不知道虚拟机在执行的时候,是如何选择正确的方法来执行的了.so,趁着周末,把压箱底的<深入理解Java虚拟机>拿出来,重新看了下第6.7.8章中的内容,梳理一下:从我们用开发工具(Intellij 或者Eclipse)写的 .java 源程

Java之多线程中的Future模式

应用场景:线程A需要线程B的执行结果,但没必要一直等待线程B执行完,这个时候可以先拿到未来的Future对象,等线程B执行完再来取真实结果. 定义RealData真实数据类,其构造函数很慢,是用户最后需要使用的数据, static class RealData<T> { protected T result; public RealData(T result) { this.result = result; } public T getResult() { return result; } }

Java中的Annotation (二、自定义Annotation)

今天学习如何开发一个自定义的Annotation.要想使Annotation有意义,还需要借用前几天学习的反射机制. 下面就开始今天的学习吧. Annotation的定义格式.它类似于新创建一个接口类文件,但为了区分,我们需要将它声明为 @interface public @interface Annotation名称{ 数据类型 变量名称(); } 下面声明了一个Annotation public @interface MyAnnotation { } 使用这个Annotation @MyAn

Java中HashMap的实现原理

最近面试中被问及Java中HashMap的原理,瞬间无言以对,因此痛定思痛觉得研究一番. 一.Java中的hashCode和equals 1.关于hashCode hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的 如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashCode一定要相同 如果对象的equals方法被重写,那么对象的hashCode也

Java中的迭代器模式

迭代器模式 提供一种方式去访问一个容器元素中的各个对象,而又不暴露该对象的内部细节. 迭代器模式的结构 1.迭代器角色 负责定义访问和遍历元素的接口 2.具体迭代器角色 实现迭代器接口,并要记录遍历中的当前位置 3.容器角色 负责提供创建具体迭代器角色的接口 4.具体容器角色 实现创建具体迭代器角色的接口,这个具体迭代器角色与该容器的结构相关 为什么需要迭代器模式 列举一个简单的示例,遍历ArrayList.LinkedList.HashSet中各个元素: 1 public static voi

Java中Synchronized的优化原理

我们知道,从 JDK1.6 开始,Java 对 Synchronized 同步锁做了充分的优化,甚至在某些场景下,它的性能已经超越了 Lock 同步锁.那么就让我们来看看,它究竟是如何优化的. 原本的问题 Synchronized是基于底层操作系统的 Mutex Lock 实现的,每次获取锁和释放锁的操作都会带来用户态和内核态的切换,从而增加系统性能开销. 因此,在锁竞争激烈的情况下,Synchronized同步锁在性能上就表现得非常糟糕,它也常被大家称为重量级锁. 到了 JDK1.5 版本,并

JAVA中注解的实现原理

注解的本质 「java.lang.annotation.Annotation」接口中有这么一句话,用来描述『注解』. The common interface extended by all annotation types 所有的注解类型都继承自这个普通的接口(Annotation) 这句话有点抽象,但却说出了注解的本质.我们看一个 JDK 内置注解的定义: @Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) publi