Rumah > Java > javaTutorial > Bolehkah Java 8 Parallel Streams Menggunakan Kolam Benang Tersuai untuk Pengasingan Tugas?

Bolehkah Java 8 Parallel Streams Menggunakan Kolam Benang Tersuai untuk Pengasingan Tugas?

Mary-Kate Olsen
Lepaskan: 2024-12-19 10:23:13
asal
311 orang telah melayarinya

Can Java 8 Parallel Streams Use Custom Thread Pools for Task Isolation?

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));
Salin selepas log masuk

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();
    }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan