Apakah mungkin untuk menentukan kumpulan utas khusus untuk aliran paralel Java 8 ? Saya tidak dapat menemukannya di mana pun.
Bayangkan saya memiliki aplikasi server dan saya ingin menggunakan aliran paralel. Tetapi aplikasinya besar dan multi-utas jadi saya ingin mengelompokkannya. Saya tidak ingin tugas berjalan lambat dalam satu modul tugas aplikasiblock dari modul lain.
Jika saya tidak dapat menggunakan kumpulan utas yang berbeda untuk modul yang berbeda, itu berarti saya tidak dapat menggunakan aliran paralel secara aman di sebagian besar situasi dunia nyata.
Coba contoh berikut ini. Ada beberapa tugas intensif CPU yang dijalankan dalam utas terpisah. Tugas memanfaatkan aliran paralel. Tugas pertama rusak, sehingga setiap langkah membutuhkan waktu 1 detik (disimulasikan oleh thread sleep). Masalahnya adalah bahwa utas lainnya macet dan menunggu tugas yang rusak selesai. Ini adalah contoh yang dibuat-buat, tetapi bayangkan aplikasi servlet dan seseorang yang mengirimkan tugas yang sudah berjalan lama ke pool bersama garpu gabungan.
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);
}
}