我有一个启动任务的要求。现在很多线程可以启动这个任务,这个任务通常需要 4-5 秒才能完成。如果某个任务已经由其他线程启动,我想阻止该任务的启动。 为了实现这个要求,我正在考虑每当某个线程启动任务时就在不同的线程中启动计时器或秒表。现在,当计时器在配置的时间间隔后超时时,另一个线程可以启动任务。 那么,在不同的线程中启动计时器或秒表来查看是否已达到特定时间是一个好的解决方案吗?有什么好的替代方案吗?
最佳答案
如果我理解正确的话,这是一个坏主意。基本上,您假设您的作业运行时间永远不会超过 5 秒,因此如果 watch 告诉您某项作业在不到 5 秒前开始,您将不会启动另一项作业。这是非常不可靠的。
而是创建某种在作业开始时设置并在作业结束时取消设置的标志。 AtomicBoolean
非常适合:
private AtomicBoolean flag = new AtomicBoolean();
//...
if(!flag.getAndSet(true)) {
try {
//do your work
} finally {
flag.set(false);
}
} else {
//Already running
}
如果您希望另一项作业等待前一项作业而不是简单地被丢弃,只需使用 synchronized
包围您的任务或使用某种不同的锁定机制即可。
注意:如果您的作业是分布式的,您将需要一个分布式锁定机制,例如数据库或 hazelcast .
关于java - 关于秒表或计时器或其他一些实用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10699215/