スレッドは、独立して動作できる場合に最適に機能します。各スレッドに独自の作業を与え、終了時に結果を収集することをお勧めします。
この例では、各スレッドが独立して動作します。
ExecutorService service =
List<Work> workList =
int blockSize = (workList.size() + threads -1)/threads;
List<Future<List<Results>>> futureResults = new ArrayList<>();
for(int i=0;i<threads;i++) {
int start = i * blockSize;
int end = Math.min(workList.size(), (i + 1) * blockSize);
final List<Work> list2 = worksList.subList(start, end);
futureResults.add(service.submit(new Callable<List<Results>>() {
public List<Results> call() {
return process(list2);
}
});
}
List<Results> results = new ArrayList<>();
for(Future<List<Results>> future:futureResults)
results.addAll(future.get());