¿Es posible especificar un grupo de subprocesos personalizado para la secuencia paralela de Java 8 ? No puedo encontrarlo en ningún lado.
Imagine que tengo una aplicación de servidor y me gustaría usar flujos paralelos. Pero la aplicación es grande y multiproceso, por lo que quiero compartimentarla. No quiero una tarea de ejecución lenta en un módulo de las tareas de bloqueo de aplicaciones de otro módulo.
Si no puedo usar diferentes grupos de subprocesos para diferentes módulos, significa que no puedo usar flujos paralelos de forma segura en la mayoría de las situaciones del mundo real.
Prueba el siguiente ejemplo. Hay algunas tareas intensivas de CPU ejecutadas en subprocesos separados. Las tareas aprovechan flujos paralelos. La primera tarea se interrumpe, por lo que cada paso dura 1 segundo (simulado por el hilo de suspensión). El problema es que otros hilos se atascan y esperan a que termine la tarea rota. Este es un ejemplo artificial, pero imagine una aplicación de servlet y alguien que envíe una tarea de larga ejecución al grupo de unión de fork compartida.
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);
}
}