我有一个启动task..Now的要求,很多线程都可以启动这个任务,这个任务通常需要4-5秒才能完成。如果某个任务已经被其他线程启动,我希望阻止该任务的启动。为了实现这一需求,我正在考虑每当任务由某个线程启动时,在不同的线程中启动一个计时器或秒表。现在,当定时器在配置的时间间隔后超时时,另一个线程可以启动任务。那么,在不同的线程中启动计时器或秒表来查看是否已经到达特定的时间是一个好的解决方案吗?有什么好的替代方案吗?
发布于 2012-05-22 17:34:26
如果你正试图在JAVA中做到这一点,那么你可以考虑在java的面向对象方法中使用synchronized块。
因此,任何你想要确保一次由一个线程完成的任务,然后在那个类中创建一个类和一个同步的方法,也要确保你所有的线程共享这个类的相同对象,并调用这个方法,在其中它们想要执行任务。
例如
Class SyncTask{
synchronized void task1(){
//Perform your task here
}
}在应用程序的生命周期中创建一次这个类的对象,然后在所有线程中使用这个相同的对象,让它们调用您想要执行任务的这个方法。
在多个线程同时调用此方法的情况下。JVM将负责处理序列,如果一个线程已经在执行任务,其他调用它的线程将等待第一个线程完成。
通过这种方式,您将确保在任何给定时间只有一个线程在执行任务。
我希望这能帮到你。
发布于 2012-05-22 17:28:25
如果我没理解错的话,这是个坏主意。基本上,您假设您的作业永远不会运行超过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。
发布于 2012-05-22 17:26:17
如果你想调度任务,选择的框架通常类似于Quartz。它应该允许你做你需要的事情,甚至更多。关于非运行并发任务的问题,我建议你看看this之前的SO post,它应该会给你指明正确的方向。
https://stackoverflow.com/questions/10699215
复制相似问题