Def*_*ult 8 java multithreading
Java的ExecutorService接口定义了一个方法invokeAll,该方法接收Callable要同时处理的对象集合.但是,该invokeAll方法本身在返回之前等待所有任务完成运行,使其成为阻塞方法.
在我的测试环境中,我不关心这些任务的返回值,我只需要它们同时运行.现在,我知道我可以手动创建新的Thread或Runnable对象并自己启动它们,但如果我可以简单地创建一个Runnable或者Callable对象的集合并将它们传递给一个开始为我执行它们并立即返回的方法,它会很好而且干净.
有人知道现有的库类有我描述的方法吗?做一些研究时我找不到一个.
我真的很惊讶这样的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;
}
Run Code Online (Sandbox Code Playgroud)
你可以使用ExecutorService.invokeAny(). 您必须等待一个线程完成,但不必等待所有线程完成。或者,由于您已经有了 invokeAll 的任务列表,因此您可以对它们进行交互并调用ExecutorService.submit每个任务。一些额外的代码,但不多......
for(Callable task : myTaskCollection)
{
myExecutorService.submit(task);
}
Run Code Online (Sandbox Code Playgroud)