Каждая работа в основном выполняет запрос к базе данных и некоторые вычисления. Код для ExecutorCompletionService снят как есть с Javadoc. Я только заменил Callables своими собственными реализациями Callable.
В этом случае вы уверены, что не ошибаетесь, думая, что они выполнены последовательно, потому что вы извлекаете результаты последовательно?
Добавьте некоторые строки журнала отладки в ваши вызовы, чтобы исключить это, и / или посмотрите на этот сценарий ограниченного использования:
public static void main(String... args) throws InterruptedException, ExecutionException {
List<Callable<String>> list = new ArrayList<Callable<String>>();
list.add(new PowersOfX(2));
list.add(new PowersOfX(3));
list.add(new PowersOfX(5));
solve(Executors.newCachedThreadPool(), list);
}
static void solve(Executor e, Collection<Callable<String>> solvers) throws InterruptedException, ExecutionException {
CompletionService<String> ecs = new ExecutorCompletionService<String>(e);
for (Callable<String> s : solvers)
ecs.submit(s);
int n = solvers.size();
for (int i = 0; i < n; ++i) {
String r = ecs.take().get();
if (r != null)
System.out.println("Retrieved: " + r);
}
}
static class PowersOfX implements Callable<String> {
int x;
public PowersOfX(int x) {this.x = x;}
@Override
public String call() throws Exception {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; i++) {
sb.append(Math.pow(2, i)).append('\t');
System.out.println(Math.pow(x, i));
Thread.sleep(2000);
}
return sb.toString();
}
}
При выполнении этого вы увидите, что числа генерируются смешанными (и, следовательно, выполняются одновременно), но получение только результатов не покажет вам детали этого уровня ..