java多线程之Future模式使用

Future模式简述

  • 传统单线程环境下,调用函数是同步的,必须等待程序返回结果后,才可进行其他处理。
    Futrue模式下,调用方式改为异步。
  • Futrue模式的核心在于:充分利用主函数中的等待时间,利用等待时间处理其他任务,充分利用计算机资源。

主要角色

  1. Main:系统启动,调用Client发出请求
  2. Client:返回Data对象,立即返回FutureData,并开启ClientThread线程装配RealData
  3. Data:返回数据的接口
  4. FutureData:Futrue数据,是一个虚拟的数据,需要装配RealData
  5. RealData:真实数据,构造比较慢。

JDK内置实现
——-jdk中已经内置future模式的实现。其中最重要的事模块是FutrueTask类,它实现了Runnable接口,作为单独的线程运行,在其run() 方法中,通过Sync内部类,调用Callable接口,并维护Callable接口的返回对象。使用FutureTask.get()方法,返回Callable接口的返回对象。
具体使用如下:

RealData.java

package com.y.www;

import java.util.concurrent.Callable;

/**
 * @description:
 * @author: lbYue
 * @date: Created in 14:11 2018/1/9
 */
public class RealData implements Callable<String> {

    private String para;

    public RealData(String para){
        this.para = para;
    }

    @Override
    public String call() throws Exception {
        //真实的业务逻辑
        StringBuffer sb = new StringBuffer();
        for (int i= 0 ;i < 10 ; i++){
            sb.append(para);
            try {
                Thread.sleep(100);
            }catch (InterruptedException e){

            }
        }

        return sb.toString();
    }
}

MainTest.java

package com.y.www;

import java.util.concurrent.*;

/**
 * @description:
 * @author: lbYue
 * @date: Created in 14:15 2018/1/9
 */
public class MainTest {

    public static void main(String[] args) throws InterruptedException,ExecutionException{

        FutureTask<String> future = new FutureTask<String>(new RealData("a"));
        ExecutorService executor = Executors.newFixedThreadPool(1);

        executor.submit(future);
        System.out.println("请求完毕!");
        try {
            System.out.println("我在睡觉别打扰我!2秒后回应");
            Thread.sleep(2000);
        }catch (InterruptedException e){

        }
        System.out.println("数据处理完成:"+future.get());

    }
}

控制台输出结果
这里写图片描述

猜你喜欢

转载自blog.csdn.net/u013719012/article/details/79020766