ลำธารขนานและอนุกรม
สตรีมแบบขนานคือการแบ่งเนื้อหาเป็นหลายบล็อกข้อมูลและประมวลผลสตรีมของแต่ละบล็อกข้อมูลแยกต่างหากด้วยเธรดที่แตกต่างกัน
การเพิ่มประสิทธิภาพแบบขนานดำเนินการใน Java 8 ดังนั้นเราจึงสามารถใช้งานข้อมูลได้อย่างง่ายดาย สตรีม API สามารถสลับระหว่างสตรีมแบบขนานและแบบต่อเนื่องผ่านแบบขนาน () และลำดับ ()
ทำความเข้าใจกับเฟรมเวิร์ก Fork/เข้าร่วม
Fork/เข้าร่วมเฟรมเวิร์ก: เมื่อจำเป็นงานขนาดใหญ่จะถูกแบ่งออกเป็นงานเล็ก ๆ หลายงาน (เมื่อไม่สามารถถอดประกอบได้) จากนั้นผลลัพธ์ของการทำงานของแต่ละงานเล็ก ๆ จะถูกเพิ่มเข้าด้วยกัน
ความแตกต่างระหว่างเฟรมเวิร์กส้อม/เข้าร่วมกับพูลเธรดแบบดั้งเดิม:
ใช้โหมด "การขโมยงาน":
เมื่อมีการดำเนินการงานใหม่มันสามารถแบ่งออกเป็นงานที่มีขนาดเล็กลงและเพิ่มงานเล็ก ๆ ลงในคิวเธรดจากนั้นขโมยหนึ่งจากคิวของเธรดแบบสุ่มและใส่ไว้ในคิวของตัวเอง
เมื่อเปรียบเทียบกับการใช้งานสระว่ายน้ำทั่วไปข้อดีของเฟรมเวิร์กส้อม/เข้าร่วมจะสะท้อนให้เห็นในวิธีการจัดการงานที่มีอยู่ในนั้น ในพูลเธรดทั่วไปหากเธรดกำลังดำเนินงานที่ไม่สามารถทำงานต่อไปได้ด้วยเหตุผลบางอย่างเธรดจะอยู่ในสถานะรอ อย่างไรก็ตามในการใช้ Framework Fork/เข้าร่วมหากปัญหาย่อยไม่สามารถดำเนินการต่อไปได้เนื่องจากกำลังรอการดำเนินการย่อยอื่น ๆ จากนั้นเธรดที่จัดการกับปัญหาย่อยจะมองหาปัญหาย่อยอื่น ๆ ที่ยังไม่ได้ทำงานเพื่อดำเนินการ วิธีนี้จะช่วยลดเวลารอของเธรดและปรับปรุงประสิทธิภาพ
นำเข้า java.time.duration; นำเข้า java.time.instant; นำเข้า java.util.concurrent.forkjoinpool; นำเข้า java.util.concurrent.forkjointask; นำเข้า java.util.concurrent.recursivetask; xx) {} โมฆะคงที่ส่วนตัว test1 () {start start = start.now (); ForkJoinPool Pool = New ForkJoinPool (); ForkJoinTask <long> task = new forkJoincalculate (0L, 1000000000L); ผลรวมยาว = pool.invoke (งาน); System.out.println (ผลรวม); end end = ทันทีตอนนี้ (); System.out.println ("เวลาอุปถัมภ์"+duration.between (start, end) .tomillis ()+"ms"); // เวลาบริโภค 3409ms} โมฆะคงที่ส่วนตัว test2 () {start ทันที = ทันที now (); Long Sum = longstream.rangeclosed (0L, 10l, 10000L) .parallel (). reduce (0, ยาว :: sum); System.out.println (ผลรวม); end end = ทันทีตอนนี้ (); System.out.println ("เวลาการบริโภค" + duration.between (เริ่มต้น, สิ้นสุด) .tomillis () + "MS"); // เวลาการใช้เวลา 2418ms}} คลาส ForkJoinculate ขยายการเรียกใช้ซ้ำ ปลายยาวส่วนตัว; เกณฑ์ความยาวของเอกชนคงที่ = 2500000000l; // ค่าวิกฤตค่า publicalcolarculate (เริ่มยาว, ปลายยาว) {this.start = start; this.end = สิ้นสุด; } @Override ป้องกันการคำนวณยาว () {ความยาวยาว = สิ้นสุด - เริ่ม; if (ความยาว <= threshold) {long sum = 0; สำหรับ (long i = start; i <= end; i ++) {sum+= i; } return sum; } else {Long Middle = (Start+End)/2; ForkJoinculate left = new forkjoinculate (เริ่มต้นกลาง); left.fork (); ForkJoinculate Right = New ForkJoinculate (Middle+1, End); Right.fork (); return left.oin () + ขวา. join (); -ชั้นเรียนเสริม
ตัวเลือก <t> คลาส (java.util.optional) เป็นคลาสคอนเทนเนอร์ที่แสดงว่ามีค่าอยู่หรือไม่มีอยู่
ปรากฎว่า null หมายความว่าไม่มีค่าและตอนนี้ทางเลือกสามารถแสดงแนวคิดนี้ได้ดีขึ้น และสามารถหลีกเลี่ยงข้อยกเว้นตัวชี้ว่าง
วิธีการทั่วไป:
ไม่เป็นตัวเลือกของ (t t): สร้างอินสแตนซ์เสริม
ตัวเลือก. empty (): สร้างอินสแตนซ์ตัวเลือกที่ว่างเปล่า
ตัวเลือก. ofnullable (t t): ถ้า t ไม่ใช่โมฆะให้สร้างอินสแตนซ์ที่เป็นตัวเลือกมิฉะนั้นสร้างอินสแตนซ์ที่ว่างเปล่า
ispresent (): กำหนดว่ารวมค่าไว้หรือไม่
orelse (t t): หากวัตถุโทรมีค่าให้ส่งคืนค่ามิฉะนั้นจะส่งคืน t
orelseget (ซัพพลายเออร์ S): หากวัตถุการโทรมีค่าให้ส่งคืนค่าที่ได้รับโดย s
MAP (ฟังก์ชั่น F): หากมีค่าในการประมวลผลและส่งคืนตัวเลือกที่ผ่านการประมวลผลมิฉะนั้นจะส่งคืนตัวเลือก. sempty ()
FlatMap (ฟังก์ชั่นแม็พ): คล้ายกับแผนที่ค่าส่งคืนจะต้องเป็นทางเลือก
Public Class PotainAltest1 {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {สตริง s = สตริงใหม่ ("ha"); // ตัวเลือก <String> op = poiceal.of (null); // // string s1 = op.get (); // system.out.println (s1); // ตัวเลือก <String> op1 = potainal.empty (); // string s1 = op1.get (); // system.out.println (s1); ตัวเลือก <String> op1 = potainal.ofnullable (null); // system.out.println (op1.ispresent ()); // system.out.println (op1.orelse (สตริงใหม่ ("Google"))); //system.out.println (op1.orelseget (() -> สตริงใหม่ ("Ali"))); ตัวเลือก <String> op2 = op1.map ((x) -> x.toLowerCase ()); สตริง s2 = op2.get (); System.out.println (S2); - @Test โมฆะสาธารณะ test5 () {man man = คนใหม่ (); ชื่อสตริง = getGodnessName (man); System.out.println (ชื่อ); } // ข้อกำหนด: รับชื่อของเทพธิดาในสตริงสาธารณะของมนุษย์สตริง getGodnessName (ชายคน) {ถ้า (มนุษย์! = null) {godness g = man.getGod (); if (g! = null) {return g.getName (); }} return "CANG ครู"; } // ใช้คลาสเอนทิตีที่เป็นตัวเลือก @Test โมฆะสาธารณะ test6 () {ตัวเลือก <Godness> Godness = poor.ofnullable (ใหม่ Godness ("Lin chiling")); ตัวเลือก <WENMAN> op = เป็นตัวเลือก. ofnullable (Newman (Godness)); ชื่อสตริง = getGodnessName2 (op); System.out.println (ชื่อ); } สตริงสาธารณะ getGodnessName2 (ตัวเลือก <EWMAN> man) {return man.orelse (Newman ()) .getGodness () .orelse (ใหม่ Godness ("Teacher Cang")) .getName (); } // หมายเหตุ: ไม่สามารถเป็นตัวเลือกไม่สามารถเป็นระดับสาธารณะระดับนิวแมน {ตัวเลือกส่วนตัว <Godness> Godness = ondmental.empty (); พระเจ้าส่วนตัวพระเจ้า; ทางเลือกสาธารณะ <Godness> getGod () {return ploenal.of (พระเจ้า); } Public Newman () {} นิวแมนสาธารณะ (ตัวเลือก <Dodness> พระเจ้า) {this.godness = Godness; } public publical <godness> getGodness () {return godness; } โมฆะสาธารณะ setGodness (ตัวเลือก <Fodness> พระเจ้า) {this.godness = พระเจ้า; } @Override Public String ToString () {return "Newman [Godness =" + Godness + "]"; -ข้างต้นเป็นประสบการณ์ทั้งหมดของการใช้ ForkJoin และเฟรมเวิร์กเสริมใน Java 8 ที่เราได้รวบรวมไว้สำหรับคุณ หากคุณยังไม่เข้าใจสิ่งใดที่คุณไม่เข้าใจเมื่อคุณเรียนรู้คุณสามารถพูดคุยในพื้นที่ข้อความด้านล่าง