Kolam Benang Tersuai untuk Java 8 Aliran Selari
Dalam alam Java 8 aliran selari, persoalan timbul: adakah mungkin untuk menggunakan kumpulan benang tersuai untuk tugasan tertentu? Walaupun carian yang meluas, keupayaan ini telah mengelak daripada banyak pembangun.
Pertimbangkan aplikasi pelayan berbilang benang di mana aliran selari dikehendaki. Walau bagaimanapun, untuk mengekalkan pembahagian dan menghalang tugas daripada satu modul menyekat yang lain, kumpulan benang yang berbeza diperlukan untuk setiap modul.
Untuk menggambarkan isu ini, pertimbangkan contoh berikut:
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));
Dalam ini contoh rekaan, tugasan intensif CPU dilaksanakan secara selari menggunakan Executors.newCachedThreadPool(). Tugas pertama sengaja diperlahankan oleh tidur benang simulasi. Akibatnya, tugas lain menjadi tersekat, menunggu penyelesaiannya. Ini menunjukkan bagaimana tugasan yang perlahan dalam satu modul boleh menghalang tugasan dalam modul lain.
Walau bagaimanapun, terdapat penyelesaian yang bijak untuk dilema ini: melaksanakan operasi selari sebagai tugasan dalam kumpulan gabungan garpu tertentu. Dengan berbuat demikian, mereka kekal terpencil daripada kumpulan cantuman garpu biasa yang digunakan oleh operasi aliran selari yang lain.
final int parallelism = 4; ForkJoinPool forkJoinPool = null; try { forkJoinPool = new ForkJoinPool(parallelism); final List<Integer> primes = forkJoinPool.submit(() -> // Parallel task here, for example IntStream.range(1, 1_000_000).parallel() .filter(PrimesPrint::isPrime) .boxed().collect(Collectors.toList()) ).get(); System.out.println(primes); } catch (InterruptedException | ExecutionException e) { throw new RuntimeException(e); } finally { if (forkJoinPool != null) { forkJoinPool.shutdown(); } }
Teknik ini memanfaatkan ForkJoinTask.fork(), yang menyatakan bahawa jika tugas semasa berjalan dalam fork-join pool, pelaksanaan tak segerak harus berlaku dalam pool tersebut. Jika tidak, ForkJoinPool.commonPool() akan digunakan.
Dengan menggunakan pendekatan ini, anda boleh menggunakan strim selari dengan selamat dalam pelbagai modul dalam aplikasi berbilang benang tanpa menjejaskan prestasi atau pembahagian tugas.
Atas ialah kandungan terperinci Bolehkah Java 8 Parallel Streams Menggunakan Kolam Benang Tersuai untuk Pengasingan Tugas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!