【并发编程】- ExecutorService的invokeAll方法全部任务执行正确

432 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

ExecutorService使用方法invokeAll(Collection tasks)全部的任务执行正确阻塞情况

invokeAIl()方法会返回所有任务的执行结果值,并且此方法执行的效果是阻塞执行的,要等把所有的结果都取回时再继续向下运行。

第一个线程执行代码如下:

public class OFirstCallable implements Callable<String> {

    @Override
    public String call() throws Exception {
        System.out.println(Thread.currentThread().getName()+ "线程执行开始时间:"+ System.currentTimeMillis());
        Thread.sleep(5000);
        System.out.println(Thread.currentThread().getName()+"线程执行结束时间:" + System.currentTimeMillis());
        return super.getClass().getName();
    }
}

第二个线程执行代码如下:

public class OSecondCallable implements Callable<String> {
        @Override
        public String call() throws Exception {
            System.out.println(Thread.currentThread().getName()+ "线程执行开始时间:"+ System.currentTimeMillis());
            Thread.sleep(10000);
            System.out.println(Thread.currentThread().getName()+"线程执行结束时间:" + System.currentTimeMillis());
            return super.getClass().getName();
        }
}

运行类执行代码如下:

public class invokeAllRun {
    public static void main(String[] args) {
        OFirstCallable oFirstCallable = new OFirstCallable();
        OSecondCallable oSecondCallable = new OSecondCallable();
        List<Callable<String>> list = new ArrayList<>();
        list.add(oFirstCallable);
        list.add(oSecondCallable);
        ExecutorService executorService = Executors.newCachedThreadPool();
        System.out.println("invokeAll方法执行开始时间:" + System.currentTimeMillis());
        try {
            List<Future<String>> futureList = executorService.invokeAll(list);
            System.out.println("invokeAll方法执行结束时间: " + System.currentTimeMillis());
            for (int i= 0;i< futureList.size();i++) {
                System.out.println("返回的结果:" + futureList.get(i).get() + " 返回结果时间: "+ System.currentTimeMillis());
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

    }
}

运行结果如下:

invokeAll方法执行开始时间:1664595043588

pool-1-thread-1线程执行开始时间:1664595043664

pool-1-thread-2线程执行开始时间:1664595043664

pool-1-thread-1线程执行结束时间:1664595048675

pool-1-thread-2线程执行结束时间:1664595053666

invokeAll方法执行结束时间: 1664595053666

返回的结果:com.ozx.concurrentprogram.executor.service.october.OFirstCallable 返回结果时间: 1664595053667

返回的结果:com.ozx.concurrentprogram.executor.service.october.OSecondCallable 返回结果时间: 1664595053667

从运行结果看出invokeAll()方法执行的时间为10秒,由此可见invokeAll()方法具有阻塞特性。