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