并发模型(一)——Future模式

多线程开发可以更好的发挥多核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函数会一直等待。

时间: 2024-10-13 06:39:54

并发模型(一)——Future模式的相关文章

java并发编程之future模式

1.当你想并发去执行一段代码,但是还想获取这段代码的返回结果,那么future多线程模式就可以派上用场了,代码实现如下. public class Client { public Data request() { final FutureData futureData = new FutureData(); new Thread(new Runnable() { @Override public void run() { futureData.setRealData(new RealData()

java线程深度解析(三)——并发模型(Future)

 多核CPU充分利用CPU性能,就需要使用多线程并行挖掘CPU的潜力,并行程序设计对常用的多线程结构进行抽象,总结出几种典型多线程开发设计模式. 一.future 模式--精彩无需等待 当程序提交一个请求,服务器对这个请求的处理可能很慢,在传统串行程序中,函数调用时同步的,也就是说程序必须等着服务器返回结果才会进行下一步处理.而Future 模式采用异步调用,充分利用等待的时间段,执行其他业务逻辑处理,最后再执行返回较慢的Future 数据,从而提高系统的响应速度. 1.Future 的核心

【并发编程】Future模式及JDK中的实现

1.1.Future模式是什么 先简单举个例子介绍,当我们平时写一个函数,函数里的语句一行行同步执行,如果某一行执行很慢,程序就必须等待,直到执行结束才返回结果:但有时我们可能并不急着需要其中某行的执行结果,想让被调用者立即返回.比如小明在某网站上成功创建了一个账号,创建完账号后会有邮件通知,如果在邮件通知时因某种原因耗时很久(此时账号已成功创建),使用传统同步执行的方式那就要等完这个时间才会有创建成功的结果返回到前端,但此时账号创建成功后我们并不需要立即关心邮件发送成功了没,此时就可以使用Fu

并发模型与IO模型梳理

并发模型 常见的并发模型一般包括3类,基于线程与锁的内存共享模型,actor模型和CSP模型,其中尤以线程与锁的共享内存模型最为常见.由于go语言的兴起,CSP模型也越来越受关注.基于锁的共享内存模型与后两者的主要区别在于,到底是通过共享内存来通信,还是通过通信来实现访问共享内存.由于actor模型和CSP模型,本人并不是特别了解,我主要说说最基本的并发模型,基于线程与锁的内存共享模型. 为什么要并发,本质都是为了充分利用多核CPU资源,提高性能.但并发又不能乱,为了保证正确性,需要通过共享内存

java:并发编程-Callable与Future模式

自己对线程池的理解: coresize 3 maxsize 5 blockLinkedQuenue 3 当提交的任务在<=3时,创建三个线程干活 大于3时,把任务先加入阻塞式队列,当有空闲的核心线程便去执行他们,队列中的任务执行是实际运行的线程在复用执行 如果后面有提交了很多任务,队列都放不下了,就赶紧创建新的线程去执行他们,如果任务已经大于了>队列+最大线程数,没有能力干活了,只能崩塌了,抛出拒绝异常 一.合理配置线程池 CPU密集 CPU密集的意思是该任务需要大量的运算,而没有阻塞,CPU

并发编程之Callable异步,Future模式

Callable 在Java中,创建线程一般有两种方式,一种是继承Thread类,一种是实现Runnable接口.然而,这两种方式的缺点是在线程任务执行结束后,无法获取执行结果.我们一般只能采用共享变量或共享存储区以及线程通信的方式实现获得任务结果的目的. 不过,Java中,也提供了使用Callable和Future来实现获取任务结果的操作.Callable用来执行任务,产生结果,而Future用来获得结果. Callable接口的定义如下: public interface Callable<

14.Java中的Future模式

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

利用多线程实现Future模式

一.Futrue模式 客户端发送一个长时间的请求,服务端不需等待该数据处理完成便立即返回一个伪造的代理数据(相当于商品订单,不是商品本身),用户也无需等待,先去执行其他的若干操作后,再去调用服务器已经完成组装的真实数据. 该模型充分利用了等待的时间片段.简单来说就是,如果线程A要等待线程B的结果,那么线程A没必要等待B,直到B有结果,可以先拿到一个未来的Future,等B有结果是再取真实的结果. 在多线程中经常举的一个例子就是:网络图片的下载,刚开始是通过模糊的图片来代替最后的图片,等下载图片的

线程笔记:Future模式

线程技术可以让我们的程序同时做多件事情,线程的工作模式有很多,常见的一种模式就是处理网站的并发,今天我来说说线程另一种很常见的模式,这个模式和前端里的ajax类似:浏览器一个主线程执行javascript,页面渲染等操作,当我们使用ajax向服务端发起请求,由于这个过程很慢,ajax的异步模式可以让我们无需一直等待服务端的响应,而在这个等待结果时间里做其他的事情,这个模式在线程技术力称之为Future模式. Future模式和我前面文章里说到的html5技术里的worker技术差不多,当我们一个