Чи можна вказати спеціальний пул потоків для паралельного потоку Java 8 ? Я не можу його знайти ніде.
Уявіть, що у мене є серверна програма, і я хотів би використовувати паралельні потоки. Але додаток великий і багатопотоковий, тому я хочу його розділити. Я не хочу повільно виконуваного завдання в одному модулі завдань блокування додатків з іншого модуля.
Якщо я не можу використовувати різні пули потоків для різних модулів, це означає, що я не можу безпечно використовувати паралельні потоки в більшості ситуацій реального світу.
Спробуйте наступний приклад. Існують деякі інтенсивні завдання процесора, виконані в окремих потоках. Завдання використовують паралельні потоки. Перше завдання порушено, тому кожен крок займає 1 секунду (імітується режимом сну). Проблема полягає в тому, що інші нитки застрягають і чекають, коли зламане завдання закінчиться. Це надуманий приклад, але уявіть додаток сервлетів і хтось, хто подає тривале завдання в пул приєднання до спільної вилки.
public class ParallelTest {
public static void main(String[] args) throws InterruptedException {
ExecutorService es = Executors.newCachedThreadPool();
es.execute(() -> runTask(1000)); //incorrect task
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.shutdown();
es.awaitTermination(60, TimeUnit.SECONDS);
}
private static void runTask(int delay) {
range(1, 1_000_000).parallel().filter(ParallelTest::isPrime).peek(i -> Utils.sleep(delay)).max()
.ifPresent(max -> System.out.println(Thread.currentThread() + " " + max));
}
public static boolean isPrime(long n) {
return n > 1 && rangeClosed(2, (long) sqrt(n)).noneMatch(divisor -> n % divisor == 0);
}
}