【问题标题】:Java program Check-in timerJava程序签到计时器
【发布时间】:2014-11-18 06:20:21
【问题描述】:

我正在尝试在我的程序中设置一个“签入”线程,如果另一个线程没有在时间结束之前执行“签入”命令,它将引发异常。如果另一个线程在时间结束之前进行签入,则计时器会重置并侦听另一个签入。

我对 Java 的 Timer 对象并不太熟悉,但我假设最好的方法是使用 Timer,因为我能想到的唯一其他方法是启动一个带有Thread.sleep(time) 的新线程并在它唤醒之前中断它,然后重新实例化/启动它;如果它通过Thread.sleep(time) 它会抛出异常。不过,这似乎非常粗糙且效率低下。

所以,基本思路是这样的:

  • 启动某种“超时”为 60 秒的计时器。
  • 如果达到超时,则抛出异常。
  • 如果另一个线程在计时器超时之前“签入”,则计时器会重置。

我怎样才能正确地做到这一点?

【问题讨论】:

  • 哪里会抛出异常?
  • 您可能还想查看 Java 中的线程执行器。与 Timer 非常相似,但功能更多。
  • 您需要使用ScheduledExecutorService。应该很简单。为什么你还需要这个? Thread 不只是死...
  • 我正在使用它来监控一个外部程序,该程序可能由于警报提示而随机“卡住”。该程序位于远程系统上,因此很难时刻关注它。通常,当它应该处理的项目在几个小时内没有出现在另一端时,我们会发现问题。该程序可以通过打开一个套接字通过 JavaScript 与 Java 进行通信,但由于它只是单线程的,因此每隔一段时间让它“报告”更有意义(子任务只需要几秒钟,但整个项目处理可能需要一个小时或更长时间)。

标签: java multithreading timer checkin


【解决方案1】:

使用一个ScheduledExecutorService,它返回一个可以取消的ScheduledFuture

private ScheduledExecutorService ses = 
    Executors.newSingleThreadScheduledExecutor();
private ScheduledFuture<?> bomb = null;

public void reset() {
    if(bomb != null) {
        bomb.cancel();
    }
    boom = ses.schedule(new Runnable() {
        @Override
        public void run() {
            throw new IllegalStateException("Boom");
        }
    }, 60, TimeUnit.SECONDS);
}

【讨论】:

  • 非常好!我喜欢这种方法如何在签到时立即重置,而不必等待计时器完成。如果/错过签到,这将提供更快的响应。
【解决方案2】:

创建一个扩展 java.util.TimerTask 的类。在类中,有一个 volatile 布尔变量,用于指示是否已执行签入。当另一个线程签入时,它应该将布尔值设置为 true;在类的run() 方法中应该检查布尔值,如果为假则抛出异常,如果为真则将其重置为假。

然后,在程序启动时,创建您的类的一个对象并保留对它的引用以供其他线程访问。创建一个java.util.Timer 对象,并使用scheduleAtFixedRate() 方法使用它来调度TimerTask 子类的一个对象。

请注意,仅仅抛出异常只会终止抛出异常的线程;其他线程将继续运行。如果您想要的不仅仅是日志中的堆栈跟踪,您可能需要启动应用程序关闭而不是抛出异常。

【讨论】:

  • 啊,TimerTask 是我在查看其他 Timer 示例时所缺少的。这应该适用于我需要做的事情。我会看看我明天是否可以提出一个实施方案。谢谢!
  • 非常好的使用计时器的方法,但由于签入时会立即重置计时器,我必须向 Jean 给出正确答案以获得稍微更快的警报。尽管如此,我还是学到了一些关于计时器的知识,所以 +1 建议!
  • 谢谢。你可以用计时器做同样的事情,但 Jean 不厌其烦地提供了实际代码。
  • 是的,我意识到,在我玩弄了我新发现的计时器知识之后,我发现了其他东西(再次感谢,顺便说一句)。它确实让我对 2 之间的区别感到好奇,尽管看起来唯一的区别是 Timer 使用单个线程,而另一个可以启动多个。不过,计时器看起来更容易设置。如果我能接受一个以上的正确答案,我会的,哈哈。
猜你喜欢
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多