【发布时间】:2020-09-07 15:14:22
【问题描述】:
我需要由多个线程执行单个任务,这样当第一个线程完成时,在任何其他线程完成之前,所有线程都会停止并重新启动相同的任务。这应该执行 n 次。
我的尝试是使用Callable<V> 和invokeAny() 方法(这就是我使用集合的原因),但不确定如何实现目标。
ExecutorService executor = Executors.newFixedThreadPool(10);
Callable<String> task = () -> {
someTask();
return "";
};
Set<Callable<String>> tasks = new HashSet<>();
IntStream.range(0, n).forEach(i -> {
tasks.add(task);
executor.submit(task);
});
如何完成这个?还是有更好的解决方案?
【问题讨论】:
-
executor.submit(task);将返回一个Future<String>。您只需要等待所有这些都完成。 -
谢谢,但仍不确定。他们应该在第一个任务完成后重新开始任务,所以想知道发生这种情况时我将如何收到通知?我想到了一个循环来不断检查线程是否完成,但继续检查似乎有点浪费。不知道如何在这里使用
Future<String>结果。 -
“当第一个线程结束,其他线程结束前,所有线程都停止,重新开始同一个任务”每个线程都“进行一次尝试”,当 一个 成功时,其他线程无关紧要,应该停止吗?
-
是的,就是这样
-
您是否认为如果您并行运行多个并选择最快的一个,您会比一次运行它节省时间吗?这里的用例是什么?
标签: java multithreading executorservice callable