2015-03-13 46 views
1

我有一種方法需要確保每個輸入在一個時間範圍內只運行一次。例如,該方法是;確保在x秒內每個輸入只調用一次方法

void performAction(String input); 

當前實現阻止任何輸入x秒的方法;

int timeOut = 0; 
void performAction(String input) { 
    if (hasBeenUsed()) return; 
    //carryout task 
} 

private boolean hasCallDelay() { 
    long currentTime = System.currentTimeMillis(); 

    if ((currentTime - timeOut) < TIME_DELAY) return true; 
    timeOut = currentTime; 

    return false; 
} 

這適用於單一方法調用,有沒有一種優雅的方式來超時只有相同的輸入?所以如果輸入「HELLO」,它會在x次再次用「HELLO」呼叫之前忽略它。

我在想也許某種數據結構會在一段時間後刪除條目。也是現在這隻會被一個線程調用,但我猜上述解決方案不適用於多線程。

這是一個運行的本地服務,並且有幾個客戶端可以連接到它並調用該方法。問題是用戶可以在UI上雙擊並最終調用任務兩次,我可以在UI上修復此問題,但是我需要確保所有未來的客戶端也都這樣做,所以寧願停止服務。

+0

最多可以添加使用情況對於這個問題,以便更好地理解你的問題.. – Karthikeyan 2015-03-13 10:55:42

+0

添加一些更多的信息 – user3032878 2015-03-13 10:59:53

回答

3

你可以嘗試Guaua緩存基於時間驅逐;簡而言之,您可以配置緩存條目以在配置的時間間隔後自動刪除。 您的代碼必須處理輸入,當且僅當它在緩存中不可用並且在開始執行代碼之前,您可以確保將條目添加到緩存中。

https://code.google.com/p/guava-libraries/wiki/CachesExplained

+0

這聽起來不錯!我將閱讀:D – user3032878 2015-03-13 11:04:19

+0

當然,您輸入的預期大小是多少? – Karthikeyan 2015-03-13 11:05:48

+0

該方法只能用小字符串調用,不會被經常調用,所以這是完美的! – user3032878 2015-03-13 11:06:44

2
  • 使用地圖記下輸入VS方法調用
  • 當輸入被稱爲下一次的時間,檢查從地圖上一通話時間。
  • 如果超出時間範圍,請調用方法
  • 否則,只要忽略說出任何拋出異常的sysout語句。
  • 如果時間框架爲c =超標,與新呼叫時,地圖重置價值和調用函數..

樂趣.. :)

+0

而如何我一直在地圖的值的控制,地圖會一段時間後相當大。 – user3032878 2015-03-13 11:01:18

+0

你期待地圖有多大?你如何控制它? – 2015-03-13 11:02:01

+0

如果每個輸入都會有一個線程,那麼地圖將是您最後的擔心。所以有一個擁有最佳線程數的線程池。如果您擔心映射的大小,請爲每個線程(使用線程名稱)設置一個映射,然後創建一個後臺線程,該線程每秒開始工作以掃除超出時間範圍的任何鍵值對。 – 2015-03-13 11:31:06