Callable和Future使用

概念

Future模式非常适合在处理很耗时很长的业务逻辑时进行使用,可以有效的减小系统的响应时间,提高系统的吞吐量和用户体验。

事例

这里我们来看一个小demo,解释我都加在注释里了

public class UseFuture implements Callable{

    private String para;

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

    //业务逻辑,可能执行的非常慢
    @Override
    public String call() throws Exception {
        Thread.sleep(3000);
        String result=this.para+"执行成功";
        return result;

    }

    public static void main(String[] args) {
        String queryStr="query";
        //构造FutureTask,并且传入需要真正进行业务逻辑处理的类,该类一定是实现了Callable接口的类
        FutureTask future=new FutureTask<>(new UseFuture(queryStr));
        //创建一个线程数为1的固定线程
        ExecutorService executor=Executors.newFixedThreadPool(1);
        /*提交future,会执行call方法,这里execute和submit的区别在于:
        *execute只能接受实现Runnable接口的类,
        *而submit还可以接受实现Callable接口的类。
        */
        executor.submit(future);
        System.out.println("请求提交完毕");
        try {
            /*这里可以做其他业务逻辑,也就是主线程的业务逻辑
             * 例如,我们在网上购物时,
             * 支付后,executor.submit(futuer)线程去异步的做支付后的流程,例如数据库的操作等耗时操作
             * 这里可以直接写,支付后直接显示支付成功的页面和继续购物的逻辑
             * 这样做提高了用户的体验感,不用等支付后,数据库等耗时操作都执行完,我才能继续浏览其他商品
             */
            System.out.println("让它自己慢慢执行,我们来做别的事情");
            Thread.sleep(2000);
            //调用获取数据方法,如果call()方法没有执行完成,则依然会进行等待
            System.out.println("数据:" + future.get());
        } catch (Exception e) {
            e.printStackTrace();
        }       
        executor.shutdown();


    }

}

运行结果:

Callable和Future使用_第1张图片

你可能感兴趣的:(java多线程)