[英]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.