logo

Callable vs Future في Java

يسمح تعدد مؤشرات الترابط في Java بتشغيل المهام بشكل متزامن مما يؤدي إلى تحسين الأداء والاستجابة. تقليديًا، يستخدم المطورون واجهة Runnable لتحديد المهام ولكن بها قيدين رئيسيين: لا يمكنها إرجاع نتيجة ولا يمكنها طرح استثناءات محددة. للتغلب على هذه المشكلات، قدمت Java الواجهات القابلة للاستدعاء والمستقبلية في Java 5.

المفتاح الأساسي المركب

واجهة قابلة للاستدعاء

ال واجهة قابلة للاستدعاء يمثل مهمة تُرجع نتيجة وقد تطرح استثناءً. إنه مشابه لـ Runnable ولكنه أكثر مرونة لأنه يمكنه إرجاع قيمة ورمي الاستثناءات المحددة.

Java
import 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 فإنها تقوم بإرجاع كائن مستقبلي.

Java
import 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()
معالجة الاستثناء يمكن رمي الاستثناءات المحددةيعالج النتائج والاستثناءات بعد التنفيذ
الاستخدام يحدد ما يجب تنفيذهيتحكم في المراقبين ويستعيد نتيجة المهمة
إنشاء اختبار