Callable和Future使用

本文介绍Future模式如何通过异步处理耗时任务来提高系统响应速度和用户体验。通过一个简单的示例,展示了如何利用FutureTask和ExecutorService将长时间运行的任务与主线程分离,使应用程序能够快速响应用户交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念

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

事例

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

public class UseFuture implements Callable<String>{

    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<String> 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();


    }

}

运行结果:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值