Java 如何安排有延迟的任务

Java 如何安排有延迟的任务,java,spring-boot,Java,Spring Boot,我需要安排一个任务在2分钟后运行。然后,当时间到了,我需要检查我们是否仍然在线。如果我们还在网上,我什么也不做。如果离线,那么我会做一些工作 private synchronized void schedule(ConnectionObj connectionObj) { if(connectionObj.getState() == ONLINE) { // schedule timer } else { // cancel

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

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的东西:

我不确定是否有专门的spring引导解决方案,因为它不是我所使用的东西

但是,您可以使用,它位于基本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表达式,已经解释过了。

我不确定是否有专门的spring引导解决方案,因为它不是我使用的东西

但是,您可以使用,它位于基本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表达式,对此进行了解释。

更新

考虑到您需要如何按需安排,正如您所提到的,@Scheduling不会有任何帮助。我认为最简单的解决办法是采取类似“左派”的措施

否则,正如我在评论中提到的,您可以查看SpringBootQuartz集成来创建作业,并使用Quartz对其进行调度。然后,它将负责在两分钟后运行它。这只是为了获得几乎相同的结果而编写的更多代码

原创的

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

正如本文所述,您必须使用@EnableScheduling启用调度

然后,对要与@Scheduled一起运行的方法进行注释。。您可以设置fixedDelay或cron表达式,或任何其他计时选项,以满足您的时间执行要求

更新

考虑到您需要如何按需安排,正如您所提到的,@Scheduling不会有任何帮助。我认为最简单的解决办法是采取类似“左派”的措施

否则,正如我在评论中提到的,您可以查看SpringBootQuartz集成来创建作业,并使用Quartz对其进行调度。然后,它将负责在两分钟后运行它。这只是为了获得几乎相同的结果而编写的更多代码

原创的

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

正如本文所述,您必须使用@EnableScheduling启用调度


然后,对要与@Scheduled一起运行的方法进行注释。。您可以设置fixedDelay或cron表达式,或任何其他计时选项,以满足您的时间执行要求

但我需要控制何时启动它。我认为不能告诉@Scheduled启动或停止@J_Strauton。啊,你的意思是你需要按需安排,然后在两分钟后启动线程?明白了。糟糕的是,我没有达到这个要求。您可以查看Spring Boot Quartz,但它的重量比您可能需要的要重一些。一个简单的解决方案是使用@Leftist提出的解决方案。不过我需要控制何时启动它。我认为不能告诉@Scheduled启动或停止@J_Strauton。啊,你的意思是你需要按需安排,然后在两分钟后启动线程?明白了。糟糕的是,我没有达到这个要求。您可以查看Spring Boot Quartz,但它的重量比您可能需要的要重一些。一个简单的解决方案是使用@Leftist提出的解决方案。