我写了以下代码:
ExecutorService es = Executors.newCachedThreadPool();
long start= System.currentTimeMillis();
ArrayHolder arrayHolder = new ArrayHolderBySynchronized();
List<Runnable> runnables = new ArrayList<>();
for (int i = 0; i < readerThreadCount; i++) {
es.submit(new ArrayReader(arrayHolder));
}
for (int i = 0; i < writerThreadCount; i++) {
es.submit(new ArrayWriter(arrayHolder));
}
es.shutdown();
boolean finshed = es.awaitTermination(1, TimeUnit.MINUTES);
long finished= System.currentTimeMillis();
System.out.println(finished-start);
正如我在执行代码后所理解的那样:
es.submit(new ArrayReader(arrayHolder));
新线程可以开始执行。
我想只允许在提交所有任务时启动线程。
我知道如果我使用CountDouwnLatch
,我就可以实现它。但是我想知道如果我使用ExecutorServise
,我可以实现它。
答案 0 :(得分:1)
您可以使用invokeAll
方法。来自docs:
执行给定的任务,返回持有他们的期货清单 完成后的状态和结果。 Future.isDone适用于每个人 返回列表的元素。请注意,已完成的任务可能具有 正常终止或通过抛出异常终止。结果 如果同时修改给定集合,则此方法未定义 此操作正在进行中。
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException;
<强>更新强>
实际上,您不能依赖任务执行开始和任务顺序的时间。如果您提交了所有任务,则无法确定它们是在一段时间内还是在某些事件之前执行。这取决于线程调度,您无法控制它的行为。即使您同时提交所有任务,也不意味着它们将同时执行。