يسمح تعدد مؤشرات الترابط في Java بتشغيل المهام بشكل متزامن مما يؤدي إلى تحسين الأداء والاستجابة. تقليديًا، يستخدم المطورون واجهة Runnable لتحديد المهام ولكن بها قيدين رئيسيين: لا يمكنها إرجاع نتيجة ولا يمكنها طرح استثناءات محددة. للتغلب على هذه المشكلات، قدمت Java الواجهات القابلة للاستدعاء والمستقبلية في Java 5.
المفتاح الأساسي المركب
واجهة قابلة للاستدعاء
ال واجهة قابلة للاستدعاء يمثل مهمة تُرجع نتيجة وقد تطرح استثناءً. إنه مشابه لـ Runnable ولكنه أكثر مرونة لأنه يمكنه إرجاع قيمة ورمي الاستثناءات المحددة.
Javaimport java.util.concurrent.*; public class CallableExample { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); Callable<Integer> task = () -> { int sum = 0; for (int i = 1; i <= 5; i++) sum += i; return sum; // returns result }; Future<Integer> future = executor.submit(task); System.out.println('Result: ' + future.get()); executor.shutdown(); } }
الإخراج
Result: 15
توضيح:
واجهة المستقبل
ال واجهة المستقبل يمثل نتيجة حساب غير متزامن. عندما تقوم بإرسال مهمة قابلة للاستدعاء أو التشغيل إلى ExecutorService فإنها تقوم بإرجاع كائن مستقبلي.
Javaimport java.util.concurrent.*; public class CallableFutureExample { public static void main(String[] args) { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Integer> future = executor.submit(() -> 10 + 20); try { Integer result = future.get(); // waits but returns instantly System.out.println('Result: ' + result); } catch (Exception e) { e.printStackTrace(); } finally { executor.shutdown(); } } }
الإخراج
Result: 30
توضيح: الCallableتحسب المهمة10 + 2 and ExecutorService.submit()طريقة إرجاع أFutureهدف. استخدامfuture.get()نحصل على النتيجة بمجرد اكتمال الحساب.
قابل للاستدعاء مقابل المستقبل
| ميزة | قابل للاستدعاء | مستقبل |
|---|---|---|
| غاية | يمثل مهمة تقوم بإرجاع النتيجة | يمثل نتيجة مهمة غير متزامنة |
| إرجاع نتيجة عند تنفيذها | يحمل النتيجة التي تم إرجاعها بواسطة Callable | |
| محددة في | java.util.concurrent الحزمة | java.util.concurrent الحزمة |
| تنفيذ | تم تقديمه إلى ExecutorService | تم إرجاعها بواسطة ExecutorService.submit() |
| طُرق | لديه طريقة واحدة لاستدعاء () | لديه طرق مثل get() isDone() Cancel() |
| معالجة الاستثناء | يمكن رمي الاستثناءات المحددة | يعالج النتائج والاستثناءات بعد التنفيذ |
| الاستخدام | يحدد ما يجب تنفيذه | يتحكم في المراقبين ويستعيد نتيجة المهمة |