簡體   English   中英

Java程序簽入計時器

[英]Java program Check-in timer

我正在嘗試在我的程序中設置一個“簽入”線程,如果另一個線程在時間到期之前沒有執行“簽入”命令,則會拋出異常。 如果另一個線程確實在入住前的時間到了,計時器復位,並偵聽另一個入住。

我並不過分熟悉Java的Timer對象,但我認為最好的方法是使用Timer,因為我能想到的唯一其他方法是使用Thread.sleep(time)啟動一個新線程並在它喚醒之前打斷它,然后重新實例化/啟動它; 如果它通過Thread.sleep(time)它會拋出異常。 但這似乎非常粗糙和低效。

所以,基本的想法是這樣的:

  • 啟動某種計時器,“超時”為60秒。
  • 如果達到超時,則拋出異常。
  • 如果在計時器超時之前另一個線程“簽入”,則計時器將重置。

我怎樣才能正確地做到這一點?

使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM