Rumah >Java >javaTutorial >Bagaimanakah Saya Boleh Menggunakan Kolam Benang Tersuai dengan Aliran Selari Java 8?

Bagaimanakah Saya Boleh Menggunakan Kolam Benang Tersuai dengan Aliran Selari Java 8?

Linda Hamilton
Linda Hamiltonasal
2024-12-24 17:42:18189semak imbas

How Can I Use Custom Thread Pools with Java 8 Parallel Streams?

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!

Kenyataan:
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