سؤال

أنا بدأت للتو في البحث عن العقود الآجلة والجدولة في جافا، وأنا أتساءل لماذا لا يعمل الاتصال بالجدول الزمني الذي أشير إليه. في نموذج التعليمة البرمجية هذه، يتم تشغيل التطبيق المزدوج مرة واحدة، ولكن لا يكمل التطبيق أبدا، ولا تعمل المهمة مرة أخرى، وهذا ما كنت أتوقع أن يحدث (أنا متأكد من أن المشكلة مع توقعتي).

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 الطريقة، للإبلاغ عن نتائج كل تنفيذ المهمة مرة أخرى إلى المستمعين في مؤشرات الترابط الأخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top