ScheduledExecutorService.如何在 2 个单独的服务中经过一段时间后运行两个任务



我正在尝试为我的应用程序实现持续运行的后台任务。为此,我使用了ScheduledExecutorService课。我有 2 个服务Service A Service B两者都有一个在某个时间间隔后一直运行的任务。为此,我在Service AService B中使用了以下内容

这是两个服务类中通用的代码。

Runnable postNotificationRunnable = new Runnable() {
            @Override
            public void run() {
            // statements here}
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
    scheduledExecutorService.scheduleAtFixedRate(postNotificationRunnable, 0, 1000, TimeUnit.SECONDS);

现在的问题是,当我运行应用程序时,两个服务都会启动,但只有计划的执行器服务Service A运行另一个服务不运行。 我做错了什么?P.S 我是第一次使用 ScheduledExecutorService。

ScheduledExecutorService将等待您的任务完成,如果一个任务花费的时间超过您指定的速率(在您的情况下为 1000 秒(。看看相应的Javadoc:

[...]如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始,但不会同时执行。

由于您的服务似乎表现得像守护程序(因此一直运行直到应用程序关闭(,因此您可以这样做:

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
ExecutorService pool = Executors.newCachedThreadPool();
scheduler.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        pool.execute(postNotificationRunnable);
    }
}, 0L, 1000L, TimeUnit.SECONDS);

只需将服务的实际执行委托给不影响scheduler的单独pool即可。

最新更新