Можно ли указать собственный пул потоков для Java 8 параллельный поток? Я не могу найти его нигде.
Представьте, что у меня есть серверное приложение, и я хотел бы использовать параллельные потоки. Но приложение является большим и многопоточным, поэтому я хочу его разделить. Я не хочу выполнять медленную работу в одном модуле задач прикладного блока из другого модуля.
Если я не могу использовать разные пулы потоков для разных модулей, это означает, что я не могу безопасно использовать параллельные потоки в большинстве реальных ситуаций.
Попробуйте следующий пример. В отдельных потоках выполняются некоторые интенсивные задачи ЦП. Задачи используют параллельные потоки. Первая задача разбита, поэтому каждый шаг занимает 1 секунду (имитируется потоком сна). Проблема в том, что другие потоки застревают и ждут завершения сломанной задачи. Это надуманный пример, но представьте, что приложение сервлета и кто-то отправляет многолетнюю задачу в общий пул соединений fork.
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);
}
}