Kolam Benang Boleh Disesuaikan di Java 8 Aliran Selari
Mengawal peruntukan sumber benang dalam aliran selari meningkatkan prestasi aplikasi dan modulariti. Walau bagaimanapun, masih tidak jelas cara untuk menetapkan kumpulan benang tersuai untuk operasi strim tertentu dalam Java 8.
Artikel ini meneroka isu tersebut dan menyediakan penyelesaian, mengatasi pengehadan kumpulan benang kongsi dalam aliran selari.
Pernyataan Masalah
Pertimbangkan aplikasi pelayan yang menggunakan selari aliran. Untuk mengelakkan tugas lembap dalam satu modul daripada memberi kesan kepada yang lain, pembahagian kumpulan benang dikehendaki. Walau bagaimanapun, pelaksanaan strim selari standard menggunakan kumpulan utas dikongsi untuk semua operasi.
Seperti yang ditunjukkan oleh coretan kod berikut, tugas yang terjejas melambatkan urutan lain selama-lamanya:
// CPU-intensive tasks in separate threads leveraging parallel streams 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));
Penyelesaian
Untuk melaksanakan operasi selari dalam kawasan yang ditetapkan fork-join pool, gunakannya sebagai tugas dalam kolam. Ini mengasingkan operasi daripada kumpulan kongsi:
final int parallelism = 4; ForkJoinPool forkJoinPool = null; try { forkJoinPool = new ForkJoinPool(parallelism); final List<Integer> primes = forkJoinPool.submit(() -> { // Parallel task here, for example: return IntStream.range(1, 1_000_000).parallel() .filter(PrimesPrint::isPrime) .boxed() .collect(Collectors.toList()); }).get(); System.out.println(primes); } catch (Exception e) { throw new RuntimeException(e); } finally { if (forkJoinPool != null) { forkJoinPool.shutdown(); } }
Teknik ini memanfaatkan gelagat ForkJoinTask.fork(): "Laksanakan tugas ini secara tidak segerak dalam kumpulan tugas semasa sedang dijalankan, jika berkenaan, atau menggunakan ForkJoinPool.commonPool() jika tidak dalam ForkJoinPool()."
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Kolam Benang Tersuai dengan Aliran Selari Java 8?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!