2017-01-01 83 views
-1

我想編寫一個類,它爲不同的對象維護許多定時器,並且能夠在定時器結束時通知或甚至運行任務,並且有能力取消定時器。多個定時器的處理

例如,如果我有3秒的計時器類型X的對象x表示事件EI希望能夠:1。 知道什麼時候它的過去,做一些事情 2.如果需要之前將其取消到期

我實現了自己的東西,但我相信圖書館可以提供更多。

我看了一下ScheduledPoolExecutor,但由於幾個原因,這並不符合我的需求,比如說我可能是單線程的並且能夠將我的「自己的」線程傳遞給它。

我也看了一下Timer,但它在每個Timer實例的後臺都有一個Thread,這是一個我不能容忍的大開銷。

任何想法?

+0

爲什麼你想搶先取消任務,做你想讓它完成時該怎麼辦?我真正要問的是你在試圖重建CompletionStages嗎? –

+0

@DavidEhrmann比方說,我爲網絡套接字預定了一個5秒定時器超時定時器,但在2秒後收到一些字節,現在我想取消這個定時器並設置一個新的定時器。 – slashms

+0

@HotAppleCyber​​不知道我明白你的解決方案... – slashms

回答

0

許多可能的解決方案之一可能是讓你想要從Timeable之類的超類繼承的每個對象(或定義一個接口或抽象類)。

有一個由java Timer類每秒調用一次的線程。定時器的線程將訪問它遍歷的Timeable對象的列表,並調用quantum()方法從剩餘時間中扣除。在其他地方調用setSecondsRemaining()來爲對象提供一個delta超時值,並將其添加到正在定時的對象列表中。如果你想取消對象的定時器,則調用它的cancelTimer()方法。

如果您需要高精度的時間,那麼您需要考慮對象列表的長度,需要多長時間才能使用超時線程來遍歷該列表,並執行一些工作以確保無論您的定時器線程的任何時間活動開始你在一秒鐘內完成所有的工作,並且你不會在下一個四捨五入之前開始工作。或者你可以使用不同的tick-tock值,例如10秒。許多方法來處理。

下面只是一個粗略的例子,可以幫助您理解概念,但尚未編譯,顯然不是完整的解決方案。

基類(父):

public class Timeable { 

    long secondsRemaining; 

    Timeable() {} 

    void setSecondsRemaining(long secondsRemaining) { 
     self.secondsRemaining = secondsRemaining; 
    } 

    long getSecondsRemaining() { 
     return secondsRemaining; 
    }   

    void cancelTimer() { 
     secondsRemaining = 0; 
    } 

    void subtractQuantum() { 
     if (secondsRemaining == 0) 
      return; 
     if (--secondsRemaining == 0) 
      timeout(); 
    } 

    void timeout() { 
     // default timeout handling here - can be overriden by child 
    } 
}