Привет, я думал, что с CompletableFuture и значением по умолчанию ForkJoinPool
я смогу оптимизировать выполнение задачи больше, чем классическое ExecutorService
, но я кое-что упустил
С этим кодом выполнение занимает 1 секунду, у меня есть 3 рабочих потока:
for (int i = 0; i < 3; i++) {
final int counter = i;
listTasks.add(CompletableFuture.supplyAsync(() -> {
Thread.sleep(1000);
System.out.println("Looking up " + counter + " on thread " + Thread.currentThread().getName());
return null;
}));
}
ОК, вроде нормально.
Но с этим кодом это занимает 3 секунды:
for (int i = 0; i < 9; i++) {
final int counter = i;
listTasks.add(CompletableFuture.supplyAsync(() -> {
Thread.sleep(1000);
System.out.println("Looking up " + counter + " on thread " + Thread.currentThread().getName());
return null;
}));
}
Я думал, что спящий поток будет использоваться для запуска другой ожидающей задачи, это также должно занять 1 секунду. Например, я читал, что состояние потока IO WAINTING означает, что поток можно повторно использовать для другой задачи. Могу ли я проверить это поведение с помощью Thread.sleep()
? Мой метод тестирования неверен или я что-то неправильно понял?
System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "3");
- person bodtx   schedule 26.08.2016