لماذا لا تقوم ScheduledExecutorService بتشغيل مهمة مرة أخرى بعد طرح استثناء؟

لتنفيذ المهام الدورية ، نظرت إلى Timer ] و ScheduledThreadPoolExecutor (بمؤشر واحد) وقررا استخدام الأخير ، لأنه في مرجع لـ Executors.newSingleThreadScheduledExecutor () ، فإنه يقول:

لاحظ أنه إذا كان هذا ينتهي مؤشر ترابط واحد بسبب فشل أثناء التنفيذ قبل الإغلاق ، سيحل محله جديد إذا لزم الأمر لتنفيذ المهام اللاحقة.

كانت خطتي هي استخدام هذا كإجراء وقائي ضد الاستثناءات غير المعلنة في جزء من التعليمات البرمجية للرقابة التي أرغب في مراقبة العمليات الأخرى. أردت التأكد وكتبت الاختبار أدناه ، والذي فشل على الفور. يبدو أنني كنت أقوم بافتراضات خاطئة ، أو أن هناك خطأ ما في اختباري؟

هذا هو الكود:

@Test
public void testTimer() {
    final AtomicInteger cTries = new AtomicInteger(0);
    final AtomicInteger cSuccesses = new AtomicInteger(0);

    TimerTask task = new TimerTask() {
        @Override
        public void run()
        {
            cTries.incrementAndGet();
            if (true) {
                throw new RuntimeException();
            }
            cSuccesses.incrementAndGet();
        }
    };

    /*
    Timer t = new Timer();
    t.scheduleAtFixedRate(task, 0, 500);
     */
    ScheduledExecutorService exe = Executors.newSingleThreadScheduledExecutor();
    exe.scheduleAtFixedRate(task, 0, 500, TimeUnit.MILLISECONDS);
    synchronized (this) {
        try {
            wait(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }
    exe.shutdown();
    /*
    t.purge();
     */
    Assert.assertEquals(cSuccesses.get(), 0);
    Assert.assertTrue(cTries.get() > 1, String.format("%d is not greater than 1. :(", cTries.get()));
}

24
задан Hanno Fietz 27 June 2011 в 14:36
поделиться