9

Java 的ExecutorService接口定义了一个调用方法invokeAll,该方法接收Callable要同时处理的对象集合。但是,该invokeAll方法本身在返回之前等待所有任务完成运行,使其成为阻塞方法。

在我的测试环境中,我不关心这些任务的返回值,我只需要它们同时运行。现在,我知道我可以手动创建新的Threador对象并自己启动它们,但是如果我可以简单地创建or对象的 Collection 并将它们传递给开始为我执行它们并立即返回的方法,Runnable那就太好了.RunnableCallable

有人知道具有我描述的方法的现有库类吗?我在做一些研究时找不到一个。

4

3 回答 3

5

我真的很惊讶invokeAll这种行为。该submit方法不会阻塞,因此只需为每个任务调用它:

public static <T> Collection<Future<T>> submitAll(ExecutorService service, Collection<? extends Callable<T>> tasks) {
    Collection<Future<T>> futures = new ArrayList<>(tasks.size());
    for (Callable<T> task: tasks) {
        futures.add(service.submit(task));
    }
    return futures;
}
于 2013-08-28T16:41:17.127 回答
2

submit如果您对 s 感兴趣,可以使用Future。(这也适用Callable

public static List<Future<?>> submitAll(ExecutorService executor, Collection<? extends Runnable> tasks) {
    List<Future<?>> result = new ArrayList<Future<?>>(tasks.size());
    for (Runnable task : tasks) {
        result.add(executor.submit(task));
    }
    return result;
}

或者execute如果没有

public static void executeAll(ExecutorService executor, Collection<? extends Runnable> tasks) {
    for (Runnable task : tasks) {
        executor.execute(task);
    }
}

这两种方法都只是将任务排入队列,并将在将来的某个时间执行。

于 2013-08-28T16:35:45.323 回答
0

You could use ExecutorService.invokeAny(). You would have to wait for one thread to complete, but not all of them. Alternatively, since you already have a list of tasks for invokeAll, you can interate over them and call ExecutorService.submit on each one. A bit of extra code, but not much...

for(Callable task : myTaskCollection)
{
   myExecutorService.submit(task);
}
于 2013-08-28T16:31:11.807 回答