我有一个由多个线程访问的类,每个线程请求这个类的一个方法。每个方法依次执行多个 Callables。该类使用 ExecutorService 中的 threadPool 通过 invokeAll((Collection>) executableTasks) 方法执行这些 Callables。设置如下所示:
public MyClass {
private final ExecutorService threadPool = Runtime.getRuntime().availableProcessors();
public void method1() {
List<SomeObject> results = new ArrayList<>();
List<Callable<Void>> tasks = new ArrayList<Callable<Void>>();
tasks.add(new Callable<Void>(){ ... results.add(someObject);} );
threadPool.invokeAll(tasks);
}
public void method2() {
List<SomeObject> results = new ArrayList<>();
List<Callable<Void>> tasks = new ArrayList<Callable<Void>>();
tasks.add(new Callable<Void>(){ ... results.add(someObject);} );
threadPool.invokeAll(tasks);
}
}
我很困惑这是否会同时执行类中的任务,或者 invokeAll() 会阻止执行,直到一个方法中的任务完成(意味着执行将在方法内部同时发生但不在类级别)?或者我应该使用 CompletionService 来找出任务的相应结果吗?