scheduledexecutorservice将执行,而不管以前的任务完成状态如何

zd287kbt  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(298)

我正在使用 ScheduledExecutorService 有时任务可能运行3小时才能完成 pollMergeFiles.searchForFileAndExecute() 方法,有时可能需要不到2分钟的时间来完成。
我唯一的问题是 scheduler.scheduleAtFixedRate 是否每10分钟执行一次,延迟5分钟,或者等待上一个任务运行完成,然后才开始新任务?

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    ...
    PollMergeFiles pollMergeFiles = new PollMergeFiles();
    final Runnable service = new Runnable() {
        public void run() {
            try {
                if (counter <= 256) {
                    pollMergeFiles.searchForFileAndExecute();
                } else if (counter > 256) {
                    logger.info(
                            "Shutdown the scheduler service since all counters were processed");
                    scheduler.shutdown();
                }
            } catch (Exception e) {
                logger.error("Exception found", e);
            }
        }
    };

    scheduler.scheduleAtFixedRate(service, 5, 10, TimeUnit.Minutes);
bgtovc5b

bgtovc5b1#

您可以查看java文档https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/scheduledexecutorservice.html .
scheduleatfixedrate(runnable命令,long initialdelay,long period,timeunit)创建并执行一个周期性动作,该动作在给定的初始延迟后首先启用,然后在给定的时间段内启用;也就是说,执行将在initialdelay之后开始,然后是initialdelay+period,然后是initialdelay+2*period,依此类推。
因此scheduleatfixedrate()不会等待最后一个任务完成。它将以预定义的间隔(期间字段)执行。
schedulewithfixeddelay(runnable命令,long initialdelay,long delay,timeunit)创建并执行一个周期性动作,该动作在给定的初始延迟后首先启用,然后在一次执行结束和下一次执行开始之间具有给定的延迟。
但是schedulewithfixeddelay()方法可以在执行最后一个任务后等待预定义的时间(延迟字段)。

相关问题