线程设计之future模式

Main

package com.cmos.ngkm.web.controller.basic;

public class Main {
    public static void main(String[] args) throws  InterruptedException{
        FutureClient fc = new FutureClient();
        Data data = fc.request("请求参数");
        System.out.println("请求发送成功!");
        System.out.println("做其它的事情...");

        String result = data.getRequest();
        System.out.println(result);
    }
}
FutureClient
package com.cmos.ngkm.web.controller.basic;

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

}

FutureData

package com.cmos.ngkm.web.controller.basic;

import groovy.transform.Synchronized;

public class FutureData implements Data{
    private RealData realData;

    private boolean isReady = false;
    @Override
    public synchronized String getRequest() {
        while(!isReady)
        {
            try{
                wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
        return this.realData.getRequest();
    }

    public synchronized void setRealData(RealData realData) {
        if(isReady)
        {
            return;
        }
        this.realData = realData;
        isReady = true;
        notify();
    }
}

RealData

package com.cmos.ngkm.web.controller.basic;

public class RealData implements Data{
    private String result;

    public RealData(String queryStr){
        System.out.println("根据"+queryStr+"进行查询,这是一个很耗时的操作...");
       try{
           Thread.sleep(5000);
       }catch(InterruptedException e)
       {
           e.printStackTrace();
       }
        result = "查询结果";
    }

    @Override
    public String getRequest() {
        return result;
    }
}

Data

package com.cmos.ngkm.web.controller.basic;

public interface Data {
    String getRequest();
}
 
时间: 2024-10-13 06:39:55

线程设计之future模式的相关文章

线程笔记:Future模式

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

怎么用wait、notify巧妙的设计一个Future模式?

我们知道多线程可以实现同时执行多个任务(只是看起来是同时,其实是CPU的时间片切换特别快我们没感觉而已). 现在假设一个做饭的场景,你没有厨具也没有食材.你可以去网上买一个厨具,但是这段时间,你不需要闲着啊,可以同时去超市买食材. 设想这是两个线程,主线程去买食材,然后开启一个子线程去买厨具.但是,子线程是需要返回一个厨具的. 如果用普通的线程,只有一个Run方法,而Run方法是没有返回值的,这个时候该怎么办呢? 我们就可以用JDK提供的Future模式.在主线程买完食材之后,可以主动去获取子线

线程技术 ? Future模式

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

java future模式 所线程实现异步调用(转载

java future模式 所线程实现异步调用(转载) 在多线程交互的中2,经常有一个线程需要得到另个一线程的计算结果,我们常用的是Future异步模式来加以解决.Future顾名思意,有点像期货市场的“期权”,是“对未来的一种凭证”,例如当我们买了某个房地产开发商的期房,交钱之后,开发商会给我们一个凭证(期权),这个凭证告诉我们等明年某个时候拿这个凭证就可以拿到我们所需要的房子,但是现在房子还没建好.市场上之所以有“期货”,也正由于有这种需求,才有这种供给. 这种应用在GUI上用的比较多,在设

多线程设计模式 - Future模式之JAVA实现

在之前一篇博客中介绍了Future设计模式的设计思想以及具体实现,今天我们来讲一下使用JDK原生的包如何实现. JDK内置的Future主要使用到了Callable接口和FutureTask类. Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其他线程执行的任务.Callable接口的定义如下: public interface Callable<V> { /** * Computes a result, or throws an

转多线程设计模式 - Future模式之JAVA原生实现

在之前一篇博客中介绍了Future设计模式的设计思想以及具体实现,今天我们来讲一下使用JDK原生的包如何实现. JDK内置的Future主要使用到了Callable接口和FutureTask类. Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其他线程执行的任务.Callable接口的定义如下: public interface Callable<V> { /** * Computes a result, or throws an

彻底理解Java的Future模式(转)

先上一个场景:假如你突然想做饭,但是没有厨具,也没有食材.网上购买厨具比较方便,食材去超市买更放心. 实现分析:在快递员送厨具的期间,我们肯定不会闲着,可以去超市买食材.所以,在主线程里面另起一个子线程去网购厨具. 但是,子线程执行的结果是要返回厨具的,而run方法是没有返回值的.所以,这才是难点,需要好好考虑一下. 模拟代码1: package test; public class CommonCook { public static void main(String[] args) thro

多线程手写Future模式

future模式 在进行耗时操作的时候,线程直接阻塞,我们需要优化这样的代码,让他再启动一个线程,不阻塞.可以执行下面的代码. 这个时候我们就用到了未来者模式 future设计类 只有一个方法 public interface Future<T> { T get() throws InterruptedException; } futureTask 类 public interface FutureTask<T> { T call(); } asyncFuture 类是fufure

netty源码解析(4.0)-29 Future模式的实现

Future模式是一个重要的异步并发模式,在JDK有实现.但JDK实现的Future模式功能比较简单,使用起来比较复杂.Netty在JDK Future基础上,加强了Future的能力,具体体现在: 更加简单的结果返回方式.在JDK中,需要用户自己实现Future对象的执行及返回结果.而在Netty中可以使用Promise简单地调用方法返回结果. 更加灵活的结果处理方式.JDK中只提供了主动得到结果的get方法,要么阻塞,要么轮询.Netty除了支持主动get方法外,还可以使用Listener被