003 Future与caller回调

        Future模式,也是非常经典的设计模式,这种模式主要就利用空间换时间的概念,也就是说异步执行(需要开启一个新的线程),在互联网高并发的应用服务中,我们随处可见这种理念和代码,主要就是使用了这种模式;Future模式非常适合在处理很耗时很长的业务逻辑时进行使用,可以有效的减小系统的响应时间,提高系统的吞吐量!【吞吐量:即每秒钟可以承载的请求数量。】

/* 异步执行的任务,封装成一个对象,对象要实现Callable接口,重写call()方法,
 * 在call()内写异步业务逻辑;异步调用不会阻塞主线程,主线程会继续向下执行;
 * Future节省了程序的耗时,提升了应用服务的吞吐量;
 */
public class UseFuture implements Callable<String> {
    
    private String param;
    
    public UseFuture(String param) {
        this.param = param;
    }

    @Override
    public String call() throws Exception {
        //模拟执行业务逻辑的耗时
        Thread.sleep(3000);//运行耗时3秒
        String result = this.param+"...处理完成!";
        return result;
    }
    
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        //执行查询操作
        String queryStr1 = "query1";
        String queryStr2 = "query2";
        //使用FutureTask
        FutureTask<String> future1 = new FutureTask<String>(new UseFuture(queryStr1));
        FutureTask<String> future2 = new FutureTask<String>(new UseFuture(queryStr2));
        //应用线程池执行
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        
        /* future1和future2所包含的任务就是UseFuture;
         * 调用executorService.submit()就会自动执行call()里面的具体方法,
         * 执行完成后接收结果,注意此处为异步接收,即submit()为异步操作,不会阻断和
         * 影响主线程,
         */
        executorService.submit(future1);//异步操作
        executorService.submit(future2);//异步操作
        
        System.out.println("处理其他相关的任务...");
        Thread.sleep(2000);//代表处理其他任务
        /*
         * 通过get()方法获取异步操作结果,提供可以设置超时时间的get方法;
         * get()方法也是一个阻塞中的线程;
         */
        String ret1 = future1.get();
        String ret2 = future2.get();
        
        System.out.println("数据处理完成:"+ret1);
        System.out.println("数据处理完成:"+ret2);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值