Kumpulan Benang Kustom Di Aliran Paralel Java 8

1. Ikhtisar

Java 8 memperkenalkan konsep Streams sebagai cara yang efisien untuk melakukan operasi massal pada data. Dan Aliran paralel dapat diperoleh di lingkungan yang mendukung konkurensi.

Aliran ini dapat datang dengan peningkatan kinerja - dengan biaya overhead multi-threading.

Dalam tutorial singkat ini, kita akan melihat salah satu batasan terbesar dari Stream API dan melihat bagaimana membuat aliran paralel bekerja dengan instance ThreadPool kustom , sebagai alternatif - ada perpustakaan yang menangani ini.

2. Aliran Paralel

Mari kita mulai dengan contoh sederhana - memanggil metode parallelStream pada salah satu jenis Collection - yang akan mengembalikan Aliran yang kemungkinan paralel :

@Test public void givenList_whenCallingParallelStream_shouldBeParallelStream(){ List aList = new ArrayList(); Stream parallelStream = aList.parallelStream(); assertTrue(parallelStream.isParallel()); }

Pengolahan default yang terjadi sedemikian Streaming menggunakan ForkJoinPool.commonPool (), sebuah Thread Renang bersama oleh seluruh aplikasi.

3. Kumpulan Benang Kustom

Kami benar-benar dapat mengirimkan ThreadPool khusus saat memproses aliran .

Contoh berikut memungkinkan Aliran paralel menggunakan Kumpulan Benang kustom untuk menghitung jumlah nilai panjang dari 1 hingga 1.000.000, inklusif:

@Test public void giveRangeOfLongs_whenSummedInParallel_shouldBeEqualToExpectedTotal() throws InterruptedException, ExecutionException { long firstNum = 1; long lastNum = 1_000_000; List aList = LongStream.rangeClosed(firstNum, lastNum).boxed() .collect(Collectors.toList()); ForkJoinPool customThreadPool = new ForkJoinPool(4); long actualTotal = customThreadPool.submit( () -> aList.parallelStream().reduce(0L, Long::sum)).get(); assertEquals((lastNum + firstNum) * lastNum / 2, actualTotal); }

Kami menggunakan konstruktor ForkJoinPool dengan tingkat paralelisme 4. Beberapa eksperimen diperlukan untuk menentukan nilai optimal untuk lingkungan yang berbeda, tetapi aturan praktisnya adalah memilih nomor berdasarkan berapa banyak inti yang dimiliki CPU Anda.

Selanjutnya, kami memproses konten Aliran paralel , menjumlahkannya dalam panggilan pengurangan .

Contoh sederhana ini mungkin tidak mendemonstrasikan kegunaan penuh dari penggunaan Kumpulan Thread kustom , tetapi manfaatnya menjadi jelas dalam situasi di mana kami tidak ingin mengikat Thread Pool umum dengan tugas-tugas yang berjalan lama (misalnya memproses data dari sumber jaringan) , atau Thread Pool umum sedang digunakan oleh komponen lain dalam aplikasi.

4. Kesimpulan

Kami telah melihat secara singkat cara menjalankan Stream paralel menggunakan Thread Pool kustom . Dalam lingkungan yang tepat dan dengan penggunaan tingkat paralelisme yang tepat, peningkatan kinerja dapat diperoleh dalam situasi tertentu.

Contoh kode lengkap yang direferensikan dalam artikel ini dapat ditemukan di Github.