持续创作,加速成长!这是我参与「掘金日新计划 · 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()方法具有阻塞特性。