Aliran paralel dan serial
Aliran paralel adalah untuk membagi konten menjadi beberapa blok data dan memproses aliran setiap blok data secara terpisah dengan utas yang berbeda.
Optimalisasi paralel dilakukan di Java 8, sehingga kami dapat dengan mudah mengoperasikan data secara paralel. API Stream dapat secara deklaratif beralih antara aliran paralel dan sekuensial melalui paralel () dan sekuensial ().
Pahami kerangka kerja fork/gabungan
Kerangka kerja FORK/BERGABUNG: Bila perlu, tugas besar dibagi menjadi beberapa tugas kecil (ketika tidak dapat dibongkar), dan kemudian hasil menjalankan setiap tugas kecil ditambahkan bersama -sama.
Perbedaan antara kerangka kerja garpu/gabungan dan kumpulan utas tradisional:
Gunakan mode "mencuri kerja":
Ketika tugas baru dieksekusi, ia dapat membaginya menjadi eksekusi tugas yang lebih kecil dan menambahkan tugas -tugas kecil ke antrian utas, kemudian mencuri satu dari antrian utas acak dan memasukkannya ke dalam antriannya sendiri.
Dibandingkan dengan implementasi kumpulan utas umum, keunggulan kerangka kerja garpu/gabungan tercermin dalam cara menangani tugas -tugas yang terkandung di dalamnya. Di kumpulan utas umum, jika utas menjalankan tugas yang tidak dapat terus berjalan karena alasan tertentu, utas akan dalam keadaan menunggu. Namun, dalam implementasi kerangka kerja fork/gabungan, jika suatu sub-masalah tidak dapat terus berjalan karena sedang menunggu penyelesaian sub-masalah lain. Kemudian utas yang menangani sub-masalah akan secara aktif mencari sub-masalah lain yang belum dijalankan untuk dieksekusi. Metode ini mengurangi waktu tunggu utas dan meningkatkan kinerja.
impor java.time.durasi; impor java.time.instant; impor java.util.concurrent.forkjoinpool; impor java.util.concurrent.forkjointask; import java.util.concurrent.recursivetask; impor java.util.stream.longstream; xx) {} private static void test1 () {instant start = instant.now (); Forkjoinpool pool = new forkjoinpool (); Forkjointask <long> tugas = forkjoIncalculate baru (0l, 1000000000L); Jumlah panjang = pool.invoke (tugas); System.out.println (SUM); Akhir instan = instant.now (); System.out.println ("waktu konsumsi"+durasi. Sum long = longstream.rangeclosed (0l, 10000l) .parallel () .reduce (0, long :: sum); System.out.println (SUM); Akhir instan = instant.now (); System.out.println ("Waktu Konsumsi" + Durasi. akhir panjang pribadi; Private Static Final Long Threshold = 2500000000L; // Nilai Kritis Public ForkjoIncalculate (Long Start, Long End) {this.start = start; this.end = end; } @Override Protected Long Compute () {long length = end - start; if (length <= threshold) {long sum = 0; untuk (long i = start; i <= end; i ++) {sum+= i; } return sum; } else {long middle = (start+end)/2; ForkjoIncalculate kiri = forkjoIncalculate baru (mulai, tengah); left.fork (); ForkjoIncalculate right = forkjoincalculate baru (tengah+1, end); right.fork (); return left.join () + right.join (); }}}Kelas opsional
Kelas <T> Opsional (java.util.Optional) adalah kelas kontainer yang mewakili apakah nilai ada atau tidak ada.
Ternyata null berarti bahwa nilai tidak ada, dan sekarang opsional dapat dengan lebih baik mengekspresikan konsep ini. Dan itu bisa menghindari pengecualian pointer nol.
Metode Umum:
Opsional.of (tt): Buat instance opsional
Opsional.empty (): Buat instance opsional kosong
Optional.ofnullable (tt): Jika t tidak nol, buat instance opsional, jika tidak buat instance kosong.
isPresent (): menentukan apakah nilainya disertakan
orelse (tt): Jika objek panggilan berisi nilai, kembalikan nilainya, jika tidak kembalikan t
Orelseget (Pemasok S): Jika objek panggilan berisi nilai, kembalikan nilai yang diperoleh oleh s.
Peta (fungsi f): Jika ada nilai untuk memprosesnya dan mengembalikan opsional yang diproses, jika tidak, ia mengembalikan opsional.empty ()
flatmap (fungsi mapper): mirip dengan peta, nilai pengembalian harus opsional
Public Class OptionalTest1 {public static void main (string [] args) {string s = new string ("ha"); // opsional <string> op = opsional.of (null); // // string s1 = op.get (); // system.out.println (s1); // Opsional <string> op1 = opsional.empty (); // string s1 = op1.get (); // system.out.println (s1); Opsional <String> OP1 = Opsional.ofnullable (null); // System.out.println (op1.ispresent ()); // System.out.println (op1.orelse (string baru ("Google"))); //System.out.println (op1.orelset (() -> string baru ("Ali"))); Opsional <string> op2 = op1.map ((x) -> x.tolowercase ()); String s2 = op2.get (); System.out.println (S2); }} @Test public void test5 () {man man = new man (); Name string = getGodnessName (man); System.out.println (nama); } // Persyaratan: Dapatkan nama dewi di hati seorang pria getgodnessname (manusia) {if (man! = Null) {tuhan g = man.getgod (); if (g! = null) {return g.getName (); }} mengembalikan "guru cang"; } // Gunakan kelas entitas opsional @test public void test6 () {Opsional <Godness> godness = opsional.ofnullable (dewa baru ("lin chiling")); Opsional <newman> op = opsional.ofnullable (newman newman (godness)); Name string = getGoDnessName2 (op); System.out.println (nama); } public String getGodnessName2 (Opsional <Newman> man) {return man.orelse (newman baru ()) .getGodness () .orelse (Godness baru ("guru cang")) .getName (); } // Catatan: Opsional tidak dapat diserialisasi kelas publik Newman {Private Optional <Godness> Godness = opsional.empty (); tuhan pribadi Tuhan; Opsional publik <Godness> getGod () {return opsional.of (Tuhan); } public newman () {} public newman (Opsional <Godness> Tuhan) {this.godness = godness; } Opsional publik <Godness> getGodness () {return godness; } public void setGodness (opsional <Godness> Tuhan) {this.godness = Tuhan; } @Override public string toString () {return "newman [godness =" + godness + "]"; }}Di atas adalah semua pengalaman menggunakan forkjoin dan kerangka kerja opsional di Java 8 yang telah kami kumpulkan untuk Anda. Jika Anda masih tidak memahami apa pun yang tidak Anda mengerti ketika Anda belajar, Anda dapat mendiskusikannya di area pesan di bawah ini.