Java 关于秒表、计时器或其他实用工具

Java 关于秒表、计时器或其他实用工具,java,hazelcast,Java,Hazelcast,我需要启动一个任务。现在很多线程可以启动这个任务,这个任务通常需要4-5秒才能完成。如果某个任务已经由其他线程启动,我希望阻止该任务的启动。 为了实现这个需求,我考虑在某个线程启动任务时,在另一个线程中启动计时器或秒表。现在,当计时器在配置的时间间隔后超时时,另一个线程可以启动任务。 那么,在不同的线程中启动计时器或秒表以查看是否达到了特定的时间是一个好的解决方案吗?是否有任何好的替代方案?如果要安排任务,选择的框架通常类似于。它应该能让你做你需要的事情,甚至更多。关于非运行并发任务的问题,我建

我需要启动一个任务。现在很多线程可以启动这个任务,这个任务通常需要4-5秒才能完成。如果某个任务已经由其他线程启动,我希望阻止该任务的启动。 为了实现这个需求,我考虑在某个线程启动任务时,在另一个线程中启动计时器或秒表。现在,当计时器在配置的时间间隔后超时时,另一个线程可以启动任务。
那么,在不同的线程中启动计时器或秒表以查看是否达到了特定的时间是一个好的解决方案吗?是否有任何好的替代方案?

如果要安排任务,选择的框架通常类似于。它应该能让你做你需要的事情,甚至更多。关于非运行并发任务的问题,我建议您查看上一篇SO文章,它将为您指明正确的方向。

如果我理解正确,这是一个坏主意。基本上你是在假设你的作业不会运行超过5秒,所以如果手表告诉你某个作业是在不到5秒前启动的,你就不会启动另一个作业。这是非常不可靠的

而是创建某种标志,在作业开始时设置,在作业结束时取消设置
AtomicBoolean
非常适合:

private AtomicBoolean flag = new AtomicBoolean();

//...

if(!flag.getAndSet(true)) {
    try {
        //do your work
    } finally {
        flag.set(false);
    }
} else {
    //Already running
}
如果您想让另一个作业等待上一个作业,而不是简单地被丢弃,只需使用
synchronized
或使用一些不同的锁定机制即可


注意:如果你的作业被分配,你需要一个分布式的锁机制,比如数据库或者./p>< p>如果你想在java中这样做,那么你可以考虑在java上使用面向对象的方法的同步块。 因此,您要确保的任何任务一次由一个线程完成,然后在该类中创建一个类和一个同步方法,还要确保所有线程共享该类的同一对象,并调用它们要在其中执行任务的方法

比如说

Class SyncTask{


synchronized void task1(){

//Perform your task here


}

}
在应用程序的生命周期中创建一次此类的对象,然后在所有线程中使用相同的对象,并让它们调用要执行任务的方法

如果多个线程同时调用此方法。JVM将处理这个序列,如果一个线程已经在执行一个任务,其他调用它的线程将等待第一个线程完成

通过这种方式,您将确保在任何给定的时间只有on线程在执行任务


我希望这能有所帮助。

我的任务是ping设备,如果设备没有ping,任务线程将在5秒内超时。现在我不想阻塞网络再次发送呼叫以查看设备是否没有ping。相反,我想在一个特定的时间之后给这个设备发送一个电话,看看这个设备是否再次联机。@ashishgupta\u mca:那么,如果两个线程试图在1秒内ping这个设备,第二个请求会发生什么?是否应该丢弃它,是否应该等到第一个完成,是否应该在第一个启动后至少等待5秒(以保持每5秒最多1个请求的吞吐量)?根据您的要求,我们可以建议非常不同的最佳解决方案。