Java程序签入计时器

时间:2014-09-23 21:54:26

标签: java multithreading timer checkin

我试图设置一个"签到"我的程序中的线程如果另一个线程没有执行"签到"命令在时间到了之前。如果另一个线程在时间到来之前签到,则计时器将重置并侦听另一个签到。

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

所以,基本的想法是:

  • 使用"超时"启动某种计时器60秒
  • 如果达到超时,则抛出异常。
  • 如果是另一个帖子"签入"在计时器超时之前,计时器重置。

我如何正确这样做?

2 个答案:

答案 0 :(得分:2)

使用返回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);
}

答案 1 :(得分:1)

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

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

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