ما الذي تستخدمه "مستقبل" في محرك التطبيق؟
-
23-09-2019 - |
سؤال
في ال مستندات, ، يتم تعريف FutureWrapper على هذا النحو:
FutureWrapper هو مستقبل بسيط يلف مستقبل الوالدين.
ما هو المستقبل ، لماذا تحتاج إلى لفه ومتى ستستخدمه في محرك التطبيق؟
المحلول
انها ال java.util.concurrent.Future<V>
. Javadoc المرتبط واضح جدا ويحتوي على مثال. بالنسبة للكسول ، إليك نهر copypaste:
أ
Future
يمثل نتيجة حساب غير متزامن. يتم توفير الأساليب للتحقق مما إذا كان الحساب قد اكتمل ، لانتظار اكتماله ، واسترداد نتيجة الحساب. لا يمكن استرداد النتيجة إلا باستخدام الطريقةget
عند الانتهاء من الحساب ، يتم حظره إذا لزم الأمر حتى يصبح جاهزًا. يتم إجراء الإلغاء بواسطة طريقة الإلغاء. يتم توفير طرق إضافية لتحديد ما إذا كانت المهمة مكتملة بشكل طبيعي أو تم إلغاؤها. بمجرد الانتهاء من الحساب ، لا يمكن إلغاء الحساب. إذا كنت ترغب في استخدام أFuture
من أجل الإلغاء ولكن لا توفر نتيجة قابلة للاستخدام ، يمكنك إعلان أنواع النموذجFuture<?>
والعودةnull
نتيجة للمهمة الأساسية.استخدام العينة (لاحظ أن الفئات التالية مكياج.)
interface ArchiveSearcher { String search(String target); } class App { ExecutorService executor = ... ArchiveSearcher searcher = ... void showSearch(final String target) throws InterruptedException { Future<String> future = executor.submit(new Callable<String>() { public String call() { return searcher.search(target); }}); displayOtherThings(); // do other things while searching try { displayText(future.get()); // use future } catch (ExecutionException ex) { cleanup(); return; } } }
ال
FutureTask
الفصل هو تطبيقFuture
هذا ينفذRunnable
, ، وهكذا قد يتم تنفيذها بواسطةExecutor
. على سبيل المثال ، يمكن استبدال البناء أعلاه مع إرسال:FutureTask<String> future = new FutureTask<String>(new Callable<String>() { public String call() { return searcher.search(target); }}); executor.execute(future);
تأثيرات تناسق الذاكرة: الإجراءات التي اتخذتها الحساب غير المتزامن يحدث قبل الإجراءات التي تلي المقابلة
Future.get()
في موضوع آخر.
ال FutureWrapper
هو مجرد ديكور لأي والد Future
.