[英]Java program Check-in timer
我正在嘗試在我的程序中設置一個“簽入”線程,如果另一個線程在時間到期之前沒有執行“簽入”命令,則會拋出異常。 如果另一個線程確實在入住前的時間到了,計時器復位,並偵聽另一個入住。
我並不過分熟悉Java的Timer對象,但我認為最好的方法是使用Timer,因為我能想到的唯一其他方法是使用Thread.sleep(time)
啟動一個新線程並在它喚醒之前打斷它,然后重新實例化/啟動它; 如果它通過Thread.sleep(time)
它會拋出異常。 但這似乎非常粗糙和低效。
所以,基本的想法是這樣的:
我怎樣才能正確地做到這一點?
使用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);
}
創建一個擴展java.util.TimerTask
的類。 在類中,有一個不穩定的布爾變量,用於是否已執行簽入。 當另一個線程簽入時,它應該將布爾值設置為true; 在類的run()
方法中應檢查布爾值,如果為false則拋出異常,如果為真,則將其重置為false。
然后,在程序啟動時,創建類的一個對象並保留對它的引用以供其他線程訪問。 創建一個java.util.Timer
對象,並使用它來使用scheduleAtFixedRate()
方法scheduleAtFixedRate()
TimerTask子類的一個對象。
請注意,拋出異常只會終止拋出異常的線程; 其他線程將繼續運行。 如果您不僅需要日志中的堆棧跟蹤,則可能需要啟動應用程序關閉而不是拋出異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.