سؤال

وصف

يتم تشغيل المهمة A ، والتي يمكن أن تستمر من 2s إلى 60+s.

أثناء تشغيل A ، حددت موعد خدمة ExecutorSorserity بعد 10s (تأخير) ، ستطبع "تشغيل" كل 5s (سعر ثابت).

ScheduledExecutorService scheduleNotifications = Executors
        .newSingleThreadScheduledExecutor();
scheduleNotifications.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        System.out.println("A is running");
    }
}, 10, 5, TimeUnit.SECONDS);

بمجرد الانتهاء من A ، أود طباعة "A قد انتهى". ولكن فقط إذا بدأت مهمة SchedeDexecutorService, ، بمعنى أنه طبع "الجري" مرة واحدة على الأقل.

  • إذا انتهى قبل العاشرة من القرن الماضي ، فأنا لا أطبع أي شيء.
  • إذا استغرق الأمر أكثر من 10s ، فأنا طباعة "تشغيل" كل 5s ثم "تم" بمجرد الانتهاء من A.

كيف يمكنني فعل ذلك دون استخدام علم منطقي داخل schduled runnable. هل هناك طريقة للتحقق من أن خدمتي بدأت؟

هل كانت مفيدة؟

المحلول

ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(1);
scheduler.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        System.out.println("A is running");
    }
}, 10, 5, TimeUnit.SECONDS);

Thread.sleep(20000);
scheduler.shutdown();
if (scheduler.getCompletedTaskCount() > 0) {
    System.out.println("A is done.");
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top