واجهات قابلة للاتصال والمستقبلية
Call AS واجهة مشابهة لـ Runnable.
هناك العديد من الاختلافات بين Callable و Runnable:
(1) الطريقة المحددة بواسطة Callable هي COLL () ، في حين أن الطريقة المحددة بواسطة RunNable يتم تشغيلها ().
(2) يمكن للمهمة القابلة للاتصال إرجاع القيمة بعد تنفيذها ، في حين أن المهمة القابلة للتشغيل لا يمكنها إرجاع القيمة.
(3) يمكن أن تطرد طريقة الاتصال () استثناءات ، في حين أن طريقة Run () لا يمكن أن ترمي الاستثناءات.
(4) تشغيل المهمة القابلة للاستدعاء ويمكنك الحصول على كائن مستقبلي.
يوفر طريقة للتحقق مما إذا كان قد اكتمل الحساب ، لانتظار اكتمال الحساب ، واسترداد نتائج الحساب.
من خلال الكائن المستقبلي ، يمكنك فهم حالة تنفيذ المهمة ، وإلغاء تنفيذ المهمة ، وكذلك الحصول على نتائج تنفيذ المهمة.
نسخة الكود كما يلي:
حزمة com.yao ؛
استيراد java.util.concurrent.callable ؛
استيراد java.util.concurrent.executorservice ؛
استيراد java.util.concurrent.executors ؛
استيراد java.util.concurrent.future ؛
الفئة العامة callableandfuture {
/**
* تخصيص فئة مهمة لتنفيذ واجهة القابلة للاتصال
*/
الفئة الثابتة العامة mycallableClass تنفذ قابلة للاتصال {
// موقف الشعار
علم int الخاص = 0 ؛
الجمهور mycallableClass (int flag) {
this.flag = flag ؛
}
استدعاء السلسلة العامة () يلقي الاستثناء {
if (this.flag == 0) {
// إذا كانت قيمة العلم 0 ، فأعود على الفور
إرجاع "العلم = 0" ؛
}
if (this.flag == 1) {
// إذا كانت قيمة العلم 1 ، فقم بعمل حلقة لا نهائية
يحاول {
بينما (صحيح) {
system.out.println ("looping ...") ؛
thread.sleep (2000) ؛
}
} catch (InterruptedException e) {
System.out.println ("مقاطع") ؛
}
العودة "خطأ" ؛
} آخر {
// إذا لم يكن الخاطئة 0 أو 1 ، فسيتم طرح استثناء
رمي استثناء جديد ("قيمة العلم السيئ!") ؛
}
}
}
الفراغ الثابت العام الرئيسي (سلسلة [] args) {
// تحديد 3 مهام الأنواع القابلة للاتصال
myCallableClass Task1 = new myCallableClass (0) ؛
myCallableClass Task2 = جديد myCallableClass (1) ؛
myCallableClass Task3 = جديد myCallableClass (2) ؛
// إنشاء خدمة تؤدي المهام
ExecutorService es = Executors.NewFixedThreadPool (3) ؛
يحاول {
// إرسال وتنفيذ المهمة.
// إذا كنت ترغب في الحصول على نتيجة تنفيذ المهمة أو الاستثناء ، يمكنك العمل على هذا الكائن المستقبلي
المستقبل 1 = es.submit (Task1) ؛
// الحصول على نتيجة المهمة الأولى.
System.out.println ("Task1:" + Future1.get ()) ؛
المستقبل 2 = es.submit (Task2) ؛
// انتظر لمدة 5 ثوان قبل إيقاف المهمة الثانية. لأن المهمة الثانية هي حلقة لا حصر لها
thread.sleep (5000) ؛
System.out.println ("Task2 Cancel:" + Future2.Cancel (true)) ؛
// احصل على إخراج المهمة الثالثة ، لأن تنفيذ المهمة الثالثة سيؤدي إلى استثناء
// وبالتالي فإن البيان التالي سيؤدي إلى إلقاء الاستثناء
المستقبل 3 = es.submit (Task3) ؛
System.out.println ("Task3:" + Future3.get ()) ؛
} catch (استثناء e) {
System.out.println (E.ToString ()) ؛
}
// أوقف خدمة تنفيذ المهام
es.shutdownnow () ؛
}
}