البرمجة الموازية باستخدام قابلة للاستدعاء والمستقبل
الطريقة الأكثر شيوعًا لأداء البرمجة المتوازية في Java هي ورث فئة مؤشرات الترابط أو تنفيذ واجهة Runnable. إن عيب هاتين الطريقتين هو أنه لا يمكن الحصول على نتيجة التنفيذ مباشرة بعد اكتمال المهمة ، ويجب توصيلها من خلال المتغيرات المشتركة أو بين الخيوط ، وهو أمر غير مريح للاستخدام.
بدءًا من Java 1.5 ، يتم توفير واجهات قابلة للاتصال والمستقبلية. باستخدامها ، يمكنك الحصول على نتيجة التنفيذ بعد تنفيذ المهمة.
دعونا نتعلم كيفية استخدام مقابلة قابلة للاستدعاء ومستقبل ومستقبل.
واجهة قابلة للاستدعاء
تقع الواجهة القابلة للاتصال في حزمة java.util.concurrent. هذه واجهة عامة تعلن فقط عن طريقة الاتصال ():
الواجهة العامة قابلة للاتصال <T> {t call () رمي الاستثناء ؛}بشكل عام ، يتم استخدامه بالاقتران مع واجهة ExecutorService. يتم الإعلان عن عدة طرق إرسال مثالية في واجهة ExecutorService:
<T> المستقبل <T> إرسال (المهمة القابلة للاتصال <T>) ؛ <T> المستقبل <T> إرسال (مهمة Runnable ، T Result) ؛ Future <؟> إرسال (مهمة Runnable) ؛
نوع المعلمة في طريقة إرسال الأولى قابلة للاتصال ، والآخران لا يتم تغطية هذه المقالة في الوقت الحالي.
المستقبل ومهام مستقبلية
يمكن لفئة تنفيذ الواجهة المستقبلية إجراء عمليات مثل إلغاء ، والاستعلام ، والحصول على نتائج على المهام القابلة للتشغيل أو القابلة للاتصال.
تقع الواجهة المستقبلية أيضًا تحت حزمة java.util.concurrent:
الواجهة العامة في المستقبل <T> { /***إلغاء المهمة*@param mayinterrupruprunning*هل تسمح بإلغاء المهام التي يتم تنفيذها ولكن لم تكتمل؟ إذا تم تعيين TRUE ، فهذا يعني أنه يمكن إلغاء المهمة في العملية *إذا تم تنفيذ المهمة ، فإنها تُرجع صحيحًا *إذا لم يتم تنفيذ المهمة بعد ، فإنها تعود ما إذا كان May -Interruptifrunning صحيحًا أو خطأ */ Boolean Cancel (Maysintreatfrunning) ؛ /***هل يتم إلغاء المهمة بنجاح؟ إذا تم إلغاؤه بنجاح قبل اكتمال المهمة بشكل طبيعي ، فإنه يعيد True */ Boolean Iscancelled () ؛ / ***هل يتم إكمال المهمة*/ boolean ISDONE () ؛ / ***احصل على نتيجة التنفيذ من خلال حظر*/ t get () رميات InterruptedException ، ExecutionException ؛ /***الحصول على نتيجة التنفيذ من خلال الحظر. إذا لم يتم إرجاع أي عائد خلال الوقت المحدد ، فالرئة NULL */ T GET (Timeout ، وحدة TimeUnit) رميات InterruptedException ، ExecutionException ، timeoutexception ؛}لتلخيص ، يوفر المستقبل ثلاث وظائف:
تحديد ما إذا كانت المهمة قد اكتملت ويمكنها مقاطعة المهمة والحصول على نتيجة تنفيذ المهمة
يوفر لنا JDK مجموعة مستقبلية لتنفيذ واجهة مستقبلية ، والتي لديها مُنشئين التاليين.
مستقبلي عام (قابل للاتصال <T> قابل للاتصال) {} public futureTask (Runnable Runnable ، t result) {} نموذج الرمز
باستخدام استدعاء ، المستقبل
استيراد java.util.concurrent.*؛ اختبار الطبقة العامة {public static void main (string [] args) {executorService ExecutorService = Executors.NewCachedThreadPool () ؛ مهمة المهمة = مهمة جديدة () ؛ المستقبل <integer> المستقبل = ExecutorService.Submit (Task) ؛ ExecutorService.shutdown () ؛ System.out.println ("الخيط الرئيسي هو تنفيذ المهمة ...") ؛ حاول {thread.sleep (2000) ؛ } catch (interruptedException ex) {ex.printStackTrace () ؛ } try {system.out.println ("Task Run Result:"+future.get ()) ؛ } catch (interruptedException ex) {ex.printStackTrace () ؛ } catch (ExecutionException ex) {ex.printStackTrace () ؛ } system.out.println ("تم تنفيذ جميع المهام") ؛ }} تُنطلق مهمة الفئة القابلة للاتصال <integer> {Override Public Integer Call () رمي الاستثناء {system.out.println ("Thort Thread تنفذ المهمة ...") ؛ // مهمة المحاكاة تأخذ Time Thread.sleep (5000) ؛ إرجاع 1000 ؛ }}نتائج التنفيذ:
يقوم مؤشر ترابط الطفل بتنفيذ المهمة ... الخيط الرئيسي هو تنفيذ المهمة ... نتيجة عملية المهمة: 1000 تم تنفيذ جميع المهام
استخدام قابلة للاستدعاء ، مستقبلات
استيراد java.util.concurrent.*؛ اختبار الطبقة العامة {public static void main (string [] args) {executorService ExecutorService = Executors.NewCachedThreadPool () ؛ مهمة المهمة = مهمة جديدة () ؛ FutureTask <integer> futureTask = new FutureTask <integer> (Task) ؛ ExecutorService.Submit (FutureTask) ؛ ExecutorService.shutdown () ؛ System.out.println ("الخيط الرئيسي هو تنفيذ المهمة ...") ؛ حاول {thread.sleep (2000) ؛ } catch (interruptedException ex) {ex.printStackTrace () ؛ } try {system.out.println ("Task Run Result:"+futureTask.get ()) ؛ } catch (interruptedException ex) {ex.printStackTrace () ؛ } catch (ExecutionException ex) {ex.printStackTrace () ؛ } system.out.println ("يتم تنفيذ جميع المهام") ؛ }} تنفذ مهمة الفئة من القابلة للاتصال <integer> {Override Public Integer Call () رمي الاستثناء {system.out.println ("مؤشر ترابط الطفل ينفذ المهمة ...") ؛ // محاكاة المهمة تأخذ thread.sleep (5000) ؛ إرجاع 1000 ؛ }}نتائج التنفيذ:
يقوم مؤشر ترابط الطفل بتنفيذ المهمة ... الخيط الرئيسي هو تنفيذ المهمة ... نتيجة عملية المهمة: 1000 تم تنفيذ جميع المهام
لخص
ما سبق هو كل محتوى هذه المقالة حول استخدام القابل للاتصال والمستقبل للبرمجة المتوازية في Java. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!