繁体   English   中英

如何延迟安排任务

[英]How to schedule tasks with a delay

我需要安排任务在2分钟后运行。 然后,当时间到了,我需要检查我们是否仍然ONLINE 如果我们仍然在线,我什么也不做。 如果OFFLINE那么我会做一些工作。

private synchronized void schedule(ConnectionObj connectionObj)
{
    if(connectionObj.getState() == ONLINE)
    {
        // schedule timer
    }
    else
    {
       // cancel task.
    }
}

这是我正在考虑的代码:

@Async
private synchronized void task(ConnectionObj connectionObj)
{
    try
    {
        Thread.sleep(2000); // short time for test
    }
    catch (InterruptedException e)
    {
        e.printStackTrace();
    }

    if(connectionObj.getState() == ONLINE)
    {
       // don't do anything
    }

    else
    {
       doWork();
    }
}

为了安排此任务,我应该使用@Async吗? 当我在task()方法中等待时,我可能仍会收到更多的调度请求。

SpringBoot是否具有每次调用schedule()都会创建的线程之类的东西,以便变得容易?

我正在寻找类似于Android中的postDelay()东西: 如何在Android Studio中正确使用postDelayed()?

更新资料

看到您需要如何“按需”安排它们,@ Scheduling对您所提到的无济于事。 我认为最简单的解决方案是采用@Leftist提出的建议。

否则,正如我在评论中提到的那样,您可以查看Spring Boot Quartz集成以创建作业并使用Quartz安排它。 两分钟后,它将负责运行它。 几乎相同的结果只是更多的代码。

原版的

对于Spring Boot,您可以使用内置的Scheduling支持 它将在一个单独的线程上按时运行您的代码。

如文章所述,您必须使用@EnableScheduling启用调度。

然后,用@Scheduled(..)注释要运行的方法,然后可以设置fixedDelay或cron表达式,或者设置其他任何适合您的时间执行要求的计时选项。

我不确定专门使用spring-boot解决方案,因为这不是我的工作。

但是,你可以使用ScheduledExecutorService的 ,这是基本的Java环境。 为了您的使用,它看起来像这样:

@Async
private synchronized void task(ConnectionObj connectionObj)
{
    Executors.newScheduledThreadPool(1).schedule(() -> {
        if(connectionObj.getState() == ONLINE) 
        {
            // don't do anything
        } 

        else 
        {
           doWork();
        }
    }, 2, TimeUnit.MINUTES);
}

我用lambda表达式,这是解释在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM