في جافا , مستقبل هو واجهه المستخدم الذي ينتمي إليه java.util.concurrent طَرد . يتم استخدامه لتمثيل نتيجة الحساب غير المتزامن. توفر الواجهة طرقًا للتحقق مما إذا كانت العملية الحسابية قد اكتملت أم لا، وانتظار اكتمالها، واسترداد نتيجة الحساب. بمجرد اكتمال المهمة أو الحساب، لا يمكن للمرء إلغاء الحساب.
بناء الجملة:
نيك بولوس البرق الأسود
public interface Future
مثال على مستقبل جافا
أفضل مثال على Java Future هو ExecutorService واجهه المستخدم. إنها تنتج كائنًا مستقبليًا (من بعض أساليبها) لتتبع تقدم مهمة واحدة أو أكثر غير متزامنة.
طرق واجهة المستقبل
توفر الواجهة الطرق الخمس التالية:
طريقة | وصف |
---|---|
يلغي() | يحاول إلغاء تنفيذ المهمة. |
يحصل() | تنتظر الطريقة إذا لزم الأمر حتى تكتمل العملية الحسابية، ثم تسترد نتيجتها. |
يحصل() | ينتظر إذا لزم الأمر، على الأكثر للوقت المحدد لإكمال الحساب، ثم يسترد نتيجته، إذا كانت متوفرة. |
تم إلغاء() | يعود صحيحًا إذا تم إلغاء المهمة قبل اكتمالها. |
تم() | يعود صحيحًا إذا اكتملت المهمة. |
كان هناك بعض القصور في واجهة المستقبل وهي كما يلي:
- باستخدام المستقبل، لا يمكن إكمال الحساب يدويًا.
- ولا يتم الإخطار بمجرد اكتمال عملية التبديل.
- ولا يمكن إنشاء سلسلتها ودمجها.
ومن أجل التغلب على القيود المذكورة أعلاه، جافا 8 قدَّم المستقبل الكامل .
استخدام المستقبل في البرمجة غير المتزامنة
الحصول على النتيجة
كما ناقشنا أعلاه، يمثل المستقبل نتيجة مهمة غير متزامنة. من أجل استرداد نتيجة تلك المهمة غير المتزامنة، توفر واجهة Java Future الإصدارين التاليين من أساليب get() التي تقوم كلاهما بإرجاع كائن. لاحظ أن نوع الإرجاع قد يكون نوعًا عامًا. على سبيل المثال:
Future future = ... // get Future by starting async task // do something else, until ready to check result via Future // get result from Future try { Object result = future.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); }
ملحوظة: إذا حاولنا استدعاء طريقة get() قبل اكتمال المهمة غير المتزامنة، فسيتم حظر طريقة get() حتى تصبح النتيجة جاهزة.
من أجل التغلب على النقص المذكور أعلاه، توفر الواجهة المستقبلية إصدارًا آخر من طريقة get() باستثناء مقدار وقت (بالميلي ثانية) كمعلمة. إنه يمثل أن المستقبل سينتظر فترة من الوقت لإكمال المهمة بعد أن تكون النتيجة متاحة في المستقبل. على سبيل المثال:
try { Object result = future.get(1000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { } catch (ExecutionException e) { } catch (TimeoutException e) { // thrown if timeout time interval passes // before a result is available. }
إذا لم يحصل المستقبل على أي نتيجة خلال الوقت المحدد، أ TimeoutException تم طرحه بواسطة المستقبل.
إلغاء مهمة غير متزامنة
يمكننا أيضًا إلغاء مهمة غير متزامنة في أي وقت عن طريق الاتصال بـ يلغي() طريقة واجهة المستقبل على سبيل المثال:
Future future = ... // Get Future from somewhere future.cancel();
تحقق مما إذا تم تنفيذ مهمة غير متزامنة
توفر الواجهة طريقة تم() للتحقق مما إذا كانت المهمة غير المتزامنة قد اكتملت أم لا. على سبيل المثال:
أمثلة على كود جافا
Future future = ... // Get Future from somewhere if(future.isDone()) { Object result = future.get(); } else { // do something else }
تحقق مما إذا تم إلغاء مهمة غير متزامنة
توفر الواجهة المستقبلية طريقة تم إلغاء() للتحقق مما إذا كانت المهمة غير المتزامنة التي يمثلها Future قد تم إلغاؤها أم لا. يُرجع صحيحًا إذا تم إلغاء المهمة بنجاح، وإلا يُرجع خطأ. على سبيل المثال:
Future future = ... // get Future from somewhere if(future.isCancelled()) { } else { }
مثال على مستقبل جافا
FutureExample.java
import java.util.concurrent.*; public class FutureExample { public static void main(String args[]) throws InterruptedException, ExecutionException { //ExecutorService allows us to execute tasks on threads asynchronously ExecutorService es = Executors.newSingleThreadExecutor(); //getting future //the method submit() submits a value-returning task for execution and returns the Future Future future = es.submit(() -> { //sleep thread for 2 seconds Thread.sleep(2000); return 'Welcome to Javatpoint'; }); //checks if the task is completed or not while(!future.isDone()) { System.out.println('The task is still in process.....'); //sleep thread for 2 milliseconds Thread.sleep(200); } System.out.println('Task completed! getting the result'); //getting the result after completing the task String result = future.get(); //prints the result System.out.println(result); es.shutdown(); } }
انتاج: