【问题标题】:Regarding stopwatch or timer or some other utility关于秒表或计时器或其他一些实用程序
【发布时间】:2012-05-22 09:23:16
【问题描述】:

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

【问题讨论】:

    标签: java


    【解决方案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 包围或使用一些不同的锁定机制。

    注意:如果您的作业是分布式的,您将需要分布式锁定机制,例如数据库或

    【讨论】:

    • 我的任务是 ping 一个设备,如果设备没有 ping,任务线程将在 5 秒内超时。现在我不想阻塞网络再次发送呼叫查看设备是否没有 ping。相反,我想在此设备的特定时间后发送呼叫,以查看设备是否再次在线。
    • @ashishgupta_mca: 所以如果两个线程试图在 1 秒内 ping 设备,那么第二个请求会发生什么?是否应该丢弃它,是否应该等到第一个完成,是否应该在第一个开始后等待至少 5 秒(以保持每 5 秒吞吐量最多 1 个请求)?根据您的要求,我们可以提出非常不同的最佳解决方案。
    【解决方案2】:

    如果您尝试在 java 中执行此操作,那么您可以考虑在 JAVA 的面向对象方法中使用同步块。

    因此,您要确保一次由一个线程完成的任何任务然后在该类中创建一个类和一个同步方法,还要确保所有线程共享该类的相同对象并调用此方法他们想要在其中执行任务。

    举例

    Class SyncTask{
    
    
    synchronized void task1(){
    
    //Perform your task here
    
    
    }
    
    }
    

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

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

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

    我希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      如果你想安排任务,选择的框架通常类似于Quartz。它应该允许您做您需要做的事情以及更多。关于非运行并发任务的问题,我建议您查看 this 以前的 SO 帖子,它应该为您指明正确的方向。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-17
        • 1970-01-01
        相关资源
        最近更新 更多