البحث عن وضوح على Java Scheduletexecutorservice و Futuretask
-
19-09-2019 - |
سؤال
أنا بدأت للتو في البحث عن العقود الآجلة والجدولة في جافا، وأنا أتساءل لماذا لا يعمل الاتصال بالجدول الزمني الذي أشير إليه. في نموذج التعليمة البرمجية هذه، يتم تشغيل التطبيق المزدوج مرة واحدة، ولكن لا يكمل التطبيق أبدا، ولا تعمل المهمة مرة أخرى، وهذا ما كنت أتوقع أن يحدث (أنا متأكد من أن المشكلة مع توقعتي).
runnables تعمل بشكل جيد؛ يبدو أن القذائف الغذائية تمنع إلى الأبد، لكنني لست متأكدا من السبب في أن .... ما الذي أفتقده؟
شكرا!
public class ExecutorExample {
/**
* @param args
* @throws ExecutionException
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException, ExecutionException {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(5);
FutureTask<ArrayList<String>> ft1 = new FutureTask<ArrayList<String>>(new Callable<ArrayList<String>>(){
@Override
public ArrayList<String> call() {
ArrayList<String> stuff = new ArrayList<String>();
for(int i = 0;i<10;i++){
String thing ="Adding " + i + " to result";
stuff.add(thing);
System.out.println(thing);
}
return stuff;
}});
scheduler.scheduleAtFixedRate(ft1, 0, 1, TimeUnit.SECONDS);
System.out.println(ft1.get());
System.out.println(ft1.isDone());
}
}
المحلول
المشكلة هي FutureTask
يتم استخدامه، وكما تقول وثائق الفئة، "بمجرد الانتهاء من الحساب، لا يمكن إعادة تشغيل الحساب أو إلغاؤه."
بعد run
طريقة FutureTask
تم استدعاء مرة واحدة، تعود الدعوات اللاحقة فورا، دون تفويض للمهمة Callable
نموذج.
فقط أ Runnable
يمكن استخدامها كمهمة متكررة، وهذا لا يسمح باستعادة النتيجة. بدلا من ذلك، إعطاء Runnable
مهمة رد الاتصال بأنه يمكن أن يستدعي في نهاية لها run
الطريقة، للإبلاغ عن نتائج كل تنفيذ المهمة مرة أخرى إلى المستمعين في مؤشرات الترابط الأخرى.