É possível especificar um conjunto de encadeamentos personalizado para o fluxo paralelo do Java 8 ? Não consigo encontrá-lo em lugar algum.
Imagine que eu tenho um aplicativo de servidor e gostaria de usar fluxos paralelos. Mas o aplicativo é grande e multiencadeado, então eu quero compartimentá-lo. Eu não quero uma tarefa de execução lenta em um módulo das tarefas applicationblock de outro módulo.
Se não posso usar conjuntos de encadeamentos diferentes para módulos diferentes, significa que não posso usar fluxos paralelos com segurança na maioria das situações do mundo real.
Tente o seguinte exemplo. Existem algumas tarefas intensivas da CPU executadas em threads separados. As tarefas utilizam fluxos paralelos. A primeira tarefa é interrompida, portanto, cada etapa leva 1 segundo (simulado pela suspensão do encadeamento). O problema é que outros threads ficam presos e aguardam a conclusão da tarefa quebrada. Este é um exemplo artificial, mas imagine um aplicativo de servlet e alguém enviando uma tarefa de longa execução para o pool de junção de bifurcação compartilhada.
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);
}
}