我需要启动任务。现在有很多线程可以启动此任务,此任务通常需要4-5秒才能完成。如果此任务已由其他某个线程启动,我想阻止任务的启动。 为了实现这个要求,我想在每个任务由某个线程启动时在不同的线程中启动计时器或秒表。现在,当计时器在配置的时间间隔后超时时,另一个线程可以启动任务。 那么,是否在另一个线程中启动计时器或秒表以查看是否已经达到特定时间是一个很好的解决方案?它有什么好的选择吗?
答案 0 :(得分:1)
如果我理解正确,这是一个坏主意。基本上你是在假装你的工作永远不会运行超过5秒,所以如果手表告诉你一些工作是在不到5秒钟之前启动的,你就不会再启动另一个。这非常不可靠。
而是创建某种在作业开始时设置的标志,在结束时取消设置。 AtomicBoolean
非常适合:
private AtomicBoolean flag = new AtomicBoolean();
//...
if(!flag.getAndSet(true)) {
try {
//do your work
} finally {
flag.set(false);
}
} else {
//Already running
}
如果您希望其他作业等待上一作业而不是简单地丢弃,只需使用synchronized
包围您的任务或使用其他锁定机制。
注意:如果您的作业是分布式的,您将需要一个分布式锁定机制,如数据库或hazelcast。
答案 1 :(得分:0)
答案 2 :(得分:0)
如果您尝试在java中执行此操作,则可以考虑在JAVA上使用面向对象方法的同步块。
因此,您要确保的任何任务一次由一个线程完成,然后在该类中创建一个类和一个synchronized方法,同时确保所有线程共享该类的同一对象并调用此方法他们想要执行任务。
例如
Class SyncTask{
synchronized void task1(){
//Perform your task here
}
}
在应用程序的生命周期内创建此类的对象一次,然后在所有线程中使用同一个对象,让他们调用您要执行任务的方法。
在多个线程同时调用此方法的情况下。 JVM将处理序列,如果一个线程已经在执行任务,其他调用它将等待第一个完成。
通过这种方式,您将确保只有线程在任何给定时间执行任务。
我希望这会有所帮助。