Future设计模式

1.手动实现和jdk1.5实现

package com.es.Demo;

import java.util.concurrent.*;

// future设计模式:当某个业务耗时较长,但是主线程不想等待这个业务执行完毕,需要执行其他业务时.可以
// Future模式的客户端在得到这个返回结果后并不急于对其进行处理而是调用其他业务逻辑,充分利用等待时间,
// 这就是Future模式的核心所在。在完成其他业务处理后,最后再使用返回比较慢的Future数据。这样在整个调用中就不存在无谓的等待,充分利用所有的时间片,从而提高了系统响应速度。
public class Client {
    // 获取真实数据并快速返回
    public Data req() {
        FutureData futureData = new FutureData();
        new Thread() { // 开启新线程获取真实数据
            public void run() {
                RealData realData = new RealData();
                futureData.setResult(realData); // 注入
            }
        }.start();
        return futureData;
    }

    public static void main(String[] args) {
        Client c = new Client();
        Data futureData = c.req();
        // dosomething
        System.out.println("dosomething");
        // 获取数据(当数据没有准备好时.阻塞,准备ok,notifyAll)
        futureData.getResult();


        // jdk1.5实现
        FutureTask futureTask = new FutureTask(new Callable() {
            @Override
            public String call() {
                StringBuffer buffer = new StringBuffer("s");
                for (int i = 1; i < 100; i++) {
                    buffer.append("s");
                }
                return buffer.toString();
            }

            ;
        });
        // 交给线程池
        ExecutorService exe = Executors.newFixedThreadPool(1);
        exe.submit(futureTask);
        // 轮询判断数据
        while (futureTask.isDone()) {
            try {
                System.out.println(futureTask.get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
    }
    // jdk1.8 使用CompletableFuture实现 提供四种静态方法构造    CompletableFuture对象.下回分解.......
   

}

package com.es.Demo;
// 数据接口 futureData 和 realData需实现
public interface Data {
    public String getResult();

}

package com.es.Demo;

// 包装真实数据,快速返回.注入真实数据
public class FutureData implements Data {

    private RealData realData = null;
    
    private volatile boolean flag = false;
    
    @Override
    public synchronized  String getResult() {
        while (!flag) {// 轮询判断数据是否准备,无 则阻塞.造成cpu高占用
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return realData.result;
    }

    // 注入真实数据对象或数据
    public synchronized void setResult(RealData realData) {
        if (flag){
            return;
        } // 提高效率 数据好了,无需再走下面的代码
        this.realData = realData;
        flag = true;
        notifyAll();
    }
}


// 真实数据构建--耗时业务
public class RealData implements Data {
    protected String result;

    public RealData() {
        try {
            Thread.sleep(3000);// 模拟耗时业务
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        String str="success";
        this.result=str;
    }

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

记录学习过程,有雷同见谅!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值