如何在使用执行程序的同时启动线程?

时间:2015-08-09 12:46:27

标签: java multithreading concurrency executorservice

我写了以下代码:

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,我可以实现它。

1 个答案:

答案 0 :(得分:1)

您可以使用invokeAll方法。来自docs:

  

执行给定的任务,返回持有他们的期货清单   完成后的状态和结果。 Future.isDone适用于每个人   返回列表的元素。请注意,已完成的任务可能具有   正常终止或通过抛出异常终止。结果   如果同时修改给定集合,则此方法未定义   此操作正在进行中。

<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
        throws InterruptedException;

<强>更新

实际上,您不能依赖任务执行开始和任务顺序的时间。如果您提交了所有任务,则无法确定它们是在一段时间内还是在某些事件之前执行。这取决于线程调度,您无法控制它的行为。即使您同时提交所有任务,也不意味着它们将同时执行。