Future/callable的作用,如何判断一个主线程的所有子线程全部执行结束

1 篇文章 0 订阅

 future:一般用于一个主业务中需要调用多个子业务,而且多个子业务之间相互不受影响,所有子业务都完成后统一返回的场景,可大大提高运行速度!

比如:做一份西红柿炒鸡蛋,炒西红柿和炒鸡蛋完全可以同时运行,那么就可以创建两个callable线程,同时去做,当两个都做好之后,混合起来再炒一下就行了。

如果炒西红柿5秒,炒鸡蛋5秒,混合炒5秒,正常流程的话需要15秒,但是用callable线程的话就只需要10秒(西红柿和炒鸡蛋并行处理)省去了5秒的时间!


开火

        炒西红柿

        炒鸡蛋

        混合炒

关火


开火

       future1 = callable(炒西红柿)

       future2 = callable(炒鸡蛋)

       future1.get();

       future2.get();

​       混合炒

关火

package com.ws;

import java.util.concurrent.*;

public class FutureTest {

    public static void main(String[] args) {
        /*
           如果想要获取返回值,我们需要new Callable接口,而且我们要用Executors 线程工具类
         */
        long s = System.currentTimeMillis();

        ExecutorService executor = Executors.newFixedThreadPool(2);

        Future<String> xihongshi = executor.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.sleep(5000);
                return "西红柿已经处理完成!";
            }
        });
        Future<String> jidan = executor.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.sleep(5000);
                return "鸡蛋已经处理完成!";
            }
        });
        /*
            如何拿到future的结果呢?
            future.get();
            这个get方法是一个阻塞方法,当callable子线程结束之后就能拿到结果
            get(times,type) 可以设置最大等待时长,超时则报错
         */
        try {
            // 同时get() 只有全部执行完才会往下走
            String r1 = xihongshi.get();
            System.out.println(r1);
            String r2 = jidan.get();
            System.out.println(r2);
            // DO SOME THING
            System.out.println("开始混合炒!");
            Thread.sleep(5000);
            System.out.println("炒完了,累计用时"+(System.currentTimeMillis()-s)/1000+"秒!");
            executor.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}



--------------------------------------------------------
西红柿已经处理完成!
鸡蛋已经处理完成!
开始混合炒!
炒完了,累计用时10秒!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值