È possibile specificare un pool di thread personalizzato per il flusso parallelo Java 8 ? Non riesco a trovarlo da nessuna parte.
Immagina di avere un'applicazione server e vorrei utilizzare flussi paralleli. Ma l'applicazione è grande e multi-thread, quindi voglio compartimentarla. Non voglio un'attività in esecuzione lenta in un modulo delle attività di blocco dell'applicazione da un altro modulo.
Se non riesco a utilizzare pool di thread diversi per moduli diversi, significa che non posso utilizzare in sicurezza flussi paralleli nella maggior parte delle situazioni del mondo reale.
Prova il seguente esempio. Esistono alcune attività ad alta intensità di CPU eseguite in thread separati. Le attività sfruttano flussi paralleli. La prima attività viene interrotta, quindi ogni passaggio richiede 1 secondo (simulato dalla sospensione del thread). Il problema è che altri thread si bloccano e attendono il completamento dell'attività interrotta. Questo è un esempio forzato, ma immagina un'app servlet e qualcuno che invii un'attività di lunga durata al pool di join fork condiviso.
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);
}
}