تدفقات متوازية وسلسلة
دفق مواز هو تقسيم المحتوى إلى كتل بيانات متعددة ومعالجة دفق كل كتلة بيانات بشكل منفصل مع مؤشرات ترابط مختلفة.
يتم إجراء التحسين الموازي في Java 8 ، بحيث يمكننا بسهولة تشغيل البيانات بالتوازي. يمكن أن يتحول API للتيار بشكل معني بين التدفقات المتوازية والتسلسل من خلال الموازي () و Sequential ().
فهم إطار الشوكة/الانضمام
Fork/Join Framework: عند الضرورة ، يتم تقسيم مهمة كبيرة إلى عدة مهام صغيرة (عندما لا يمكن تفكيكها) ، ثم تتم إضافة نتائج تشغيل كل مهمة صغيرة معًا.
الفرق بين إطار الشوكة/الانضمام ومجموعة الخيوط التقليدية:
استخدم وضع "سرقة العمل":
عند تنفيذ مهمة جديدة ، يمكنها تقسيمها إلى عمليات إعدام أصغر من المهام وإضافة مهام صغيرة إلى قائمة انتظار الخيط ، ثم سرقة واحدة من قائمة انتظار من المواضيع العشوائية ووضعها في قائمة الانتظار الخاصة بها.
بالمقارنة مع تنفيذ مجموعة الخيوط العامة ، تنعكس مزايا إطار الشوكة/الانضمام في طريقة التعامل مع المهام الواردة فيها. في مجموعة الخيوط العامة ، إذا قام مؤشر ترابط بتنفيذ مهمة لا يمكن الاستمرار في التشغيل لسبب ما ، فسيكون مؤشر الترابط في حالة انتظار. ومع ذلك ، في تطبيق Framework Fork/Join ، إذا لم تتمكن المشكلات الفرعية من الاستمرار في تشغيلها لأنها تنتظر الانتهاء من المشكلات الفرعية الأخرى. ثم سيبحث الخيط الذي يتولى المشكلات الفرعية بنشاط عن المشكلات الفرعية الأخرى التي لم يتم تشغيلها بعد للتنفيذ. هذه الطريقة تقلل من وقت انتظار الخيط ويحسن الأداء.
استيراد java.time.duration ؛ استيراد java.time.instant ؛ استيراد java.util.concurrent.forkjoinpool ؛ xx) {} private static void test1 () {start start = stant.now () ؛ ForkJoinpool Pool = new forkjoinpool () ؛ forkjointask <long> task = new forkjoincalculate (0L ، 1000000000L) ؛ مبلغ طويل = pool.invoke (مهمة) ؛ system.out.println (sum) ؛ النهاية الفورية = stant.now () ؛ System.out.println ("وقت الاستهلاك"+مدة. مبلغ طويل = longstream.rangeClosed (0L ، 10000L) .Paralled () .Reduce (0 ، long :: sum) ؛ system.out.println (sum) ؛ النهاية الفورية = stant.now () ؛ System.out.println ("وقت الاستهلاك" + المدة. نهاية طويلة عتبة نهائية طويلة ثابتة = 250000000000L ؛ // القيمة الحرجة forkjoincalculate (بداية طويلة ، نهاية طويلة) {this.start = start ؛ this.end = نهاية ؛ } override محمية طويلة compute () {long length = end - start ؛ if (length <= عتبة) {long sum = 0 ؛ لـ (long i = start ؛ i <= end ؛ i ++) {sum+= i ؛ } إرجاع مجموع ؛ } آخر {long middle = (start+end)/2 ؛ forkjoincalculate left = new forkjoincalculate (start ، middle) ؛ left.fork () ؛ forkjoincalculate right = new forkjoincalculate (middle+1 ، end) ؛ right.fork () ؛ العودة إلى اليسار. join () + right.join () ؛ }}}فئة اختيارية
فئة <T> اختيارية (java.util.optional) هي فئة حاوية تمثل ما إذا كانت القيمة موجودة أو غير موجودة.
اتضح أن NULL تعني أن القيمة غير موجودة ، والآن يمكن أن تعبر اختياري هذا المفهوم بشكل أفضل. ويمكن أن يتجنب استثناءات مؤشر فارغة.
الطرق الشائعة:
اختياري. من (T T): إنشاء مثيل اختياري
اختياري. empty (): إنشاء مثيل اختياري فارغ
اختياري.
ispresent (): يحدد ما إذا كانت القيمة مدرجة
orelse (t t): إذا كان كائن المكالمة يحتوي على قيمة ، فأرجع القيمة ، وإعادة إرجاع t
orelseget (الموردين): إذا كان كائن المكالمة يحتوي على قيمة ، فأرجع القيمة التي تم الحصول عليها بواسطة s.
الخريطة (الوظيفة و): إذا كانت هناك قيمة لمعالجتها وإرجاعها الاختيارية التي تمت معالجتها ، وإلا فإنها تُرجع اختياريًا. empty ()
flatmap (وظيفة الخريطة): على غرار الخريطة ، يجب أن تكون قيمة الإرجاع اختيارية
الفئة العامة OptionalTest1 {public static void main (string [] args) {string s = new string ("ha") ؛ // اختياري <string> op = اختياري (null) ؛ // // string s1 = op.get () ؛ // system.out.println (s1) ؛ // اختياري <String> op1 = emptersal.empty () ؛ // string s1 = op1.get () ؛ // system.out.println (s1) ؛ اختياري <String> op1 = اختياري. //system.out.println (op1.orelseget (() -> سلسلة جديدة ("ali"))) ؛ اختياري <string> op2 = op1.map ((x) -> x.toLowerCase ()) ؛ السلسلة S2 = op2.get () ؛ System.out.println (S2) ؛ }} test public void test5 () {man man = new man () ؛ اسم السلسلة = getGodnessName (رجل) ؛ system.out.println (name) ؛ } // المتطلبات: احصل على اسم الإلهة في سلسلة قلب الرجل getGodnessName (رجل) {if (man! = null) {gholness g = man.getgod () ؛ if (g! = null) {return g.getName () ؛ }} إرجاع "المعلم كانج" ؛ }. اختياري <Newman> OP = اختياري. اسم السلسلة = getGodnessName2 (OP) ؛ system.out.println (name) ؛ } السلسلة العامة getGodnessName2 (اختياري <newman> man) {return man.orelse (New Newman ()) .getGodness () .orelse (Godelness New ("Teacher cang") .getName () ؛ } // ملاحظة: لا يمكن اختياري من الدرجة العامة المسلسل Newman {private اختياري <GODENSS> GODESSING = اختياري. empty () ؛ الروح الخاصة الله الجمهور الاختياري <Sholness> getGod () {return propectal.of (god) ؛ } Public Newman () {} Newman (اختياري <Godelness> Gholeness) {this.godness = godness ؛ } اختياري عام <GODENST> getGodness () {return godness ؛ } public void setGodness (اختياري <Gholeness> Godness) {this.godness = godness ؛ } Override public string toString () {return "newman [godness =" + godness + "]" ؛ }}ما سبق هو كل تجربة استخدام ForkJoin والأطر الاختيارية في Java 8 التي جمعناها لك. إذا كنت لا تزال لا تفهم أي شيء لا تفهمه عندما تتعلم ، فيمكنك مناقشته في منطقة الرسائل أدناه.