我试图设置一个"签到"我的程序中的线程如果另一个线程没有执行"签到"命令在时间到了之前。如果另一个线程在时间到来之前签到,则计时器将重置并侦听另一个签到。
我并不过分熟悉Java的Timer对象,但是我假设最好的方法就是使用Timer,作为唯一的其他我可以想到的方法是启动一个带有Thread.sleep(time)
的新线程,并在它唤醒之前中断它,然后重新实例化/启动它;如果它通过Thread.sleep(time)
它会抛出异常。但这似乎非常粗糙和低效。
所以,基本的想法是:
我如何正确这样做?
答案 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子类的一个对象。
请注意,抛出异常只会终止抛出异常的线程;其他线程将继续运行。如果您不仅需要日志中的堆栈跟踪,则可能需要启动应用程序关闭而不是抛出异常。