48.线程池提交任务的方法

本文介绍了Java线程池的四种任务提交方法:execute用于执行任务,不关心结果;submit能获取任务执行结果,返回Future对象;invokeAll用于批量提交任务并获取所有结果;invokeAny则是在任一任务完成时返回结果,可设置超时机制。
摘要由CSDN通过智能技术生成

 execute方法

submit方法

提交任务task,用返回值Future获得任务执行结果。

Future 用于主线程接受线程池中线程的返回结果。

ExecutorService executorService = Executors.newFixedThreadPool(2);
        //提交第一个任务返回结果
        Future<String> future = executorService.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                log.debug("running");
                TimeUnit.SECONDS.sleep(1);
                return "ok";
            }
        });
        //提交第二个任务返回结果
        Future<String> future2 = executorService.submit(() -> {
            log.debug("running");
            TimeUnit.SECONDS.sleep(1);
            return "success";
        });

        try {
            String res = future.get();
            String res2 = future2.get();
            log.debug("res={}", res);
            log.debug("res2={}", res2);
        } catch (Exception e) {
            e.printStackTrace();
        }

invokeAll方法

提交一个任务集合,返回任务集合的所有执行结果。

带超时时间的invokeAll方法,如果规定的时间没有线程池中的任务没有执行完,会把后续的取消掉

ExecutorService executorService = Executors.newFixedThreadPool(3);
        List<Callable<String>> callableList = Arrays.asList(
            () -> {
                log.debug("第一个任务");
                TimeUnit.SECONDS.sleep(1);
                return "first blood";
            },
            () -> {
                log.debug("第二个任务");
                TimeUnit.SECONDS.sleep(2);
                return "second blood";
            },
            () -> {
                log.debug("第三个任务");
                TimeUnit.SECONDS.sleep(3);
                return "third blood";
            }
        );

        try {
            List<Future<String>> futures = executorService.invokeAll(callableList);
            futures.forEach(f -> {
                try {
                    String s = f.get();
                    log.debug("s={}", s);
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }

invokeAny方法

任务集合中只要有一个任务执行完就返回结果,并取消其它任务。

带超时的invokeAny方法

ExecutorService executorService = Executors.newFixedThreadPool(3);
        List<Callable<String>> callableList = Arrays.asList(
                () -> {
                    log.debug("第一个任务");
                    TimeUnit.SECONDS.sleep(1);
                    return "first blood";
                },
                () -> {
                    log.debug("第二个任务");
                    TimeUnit.SECONDS.sleep(2);
                    return "second blood";
                },
                () -> {
                    log.debug("第三个任务");
                    TimeUnit.SECONDS.sleep(3);
                    return "third blood";
                }
        );

        try {
            String future = executorService.invokeAny(callableList);
            log.debug("s={}", future);
        } catch (Exception e) {
            e.printStackTrace();
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卷土重来…

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值