gpt4 book ai didi

java - 如何在使用执行器的同时启动线程?

转载 作者:行者123 更新时间:2023-11-30 08:01:08 25 4
gpt4 key购买 nike

我写了以下代码:

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我可以实现它吗?

最佳答案

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

Executes the given tasks, returning a list of Futures holding their status and results when all complete. Future.isDone is true for each element of the returned list. Note that a completed task could have terminated either normally or by throwing an exception. The results of this method are undefined if the given collection is modified while this operation is in progress.

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

更新:

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

关于java - 如何在使用执行器的同时启动线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31904378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com