Kolam Benang Khusus Di Java 8 Aliran Selari

1. Gambaran keseluruhan

Java 8 memperkenalkan konsep S treams sebagai kaedah yang berkesan untuk menjalankan operasi pukal pada data. Dan Aliran selari dapat diperoleh dalam persekitaran yang menyokong serentak.

Aliran ini dapat disertakan dengan prestasi yang lebih baik - dengan kos overhed multi-threading.

Dalam tutorial ringkas ini, kita akan melihat salah satu batasan terbesar API Aliran dan melihat bagaimana membuat aliran selari berfungsi dengan contoh ThreadPool khusus , sebagai alternatif - ada perpustakaan yang menangani ini.

2. Aliran Selari

Mari kita mulakan dengan contoh mudah - memanggil kaedah parallelStream pada mana-mana jenis Koleksi - yang akan mengembalikan Aliran yang selari :

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

Pemprosesan lalai yang berlaku dalam apa-apa Stream menggunakan ForkJoinPool.commonPool (), yang Thread Pool dikongsi oleh keseluruhan permohonan.

3. Kolam Benang Tersuai

Kita sebenarnya boleh meneruskan ThreadPool khusus semasa memproses aliran .

Contoh berikut membolehkan Aliran selari menggunakan Thread Pool khusus untuk mengira jumlah nilai panjang dari 1 hingga 1,000,000, termasuk:

@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 tahap paralelisme 4. Beberapa eksperimen diperlukan untuk menentukan nilai optimum untuk persekitaran yang berbeza, tetapi peraturan praktis yang baik adalah memilih nombor berdasarkan berapa banyak teras CPU anda.

Seterusnya, kami memproses kandungan Aliran selari , menjumlahkannya dalam panggilan pengurangan .

Contoh mudah ini mungkin tidak menunjukkan kegunaan penuh menggunakan Thread Pool khusus , tetapi manfaatnya menjadi jelas dalam situasi di mana kita tidak mahu mengikat Thread Pool biasa dengan tugas yang sudah lama berjalan (misalnya memproses data dari sumber rangkaian) , atau Thread Pool biasa digunakan oleh komponen lain dalam aplikasi.

4. Kesimpulan

Kami telah melihat secara ringkas cara menjalankan Aliran selari menggunakan Thread Pool tersuai . Dalam lingkungan yang tepat dan dengan penggunaan tahap paralelisme yang betul, peningkatan prestasi dapat dicapai dalam situasi tertentu.

Sampel kod lengkap yang dirujuk dalam artikel ini boleh didapati di Github.