2016-04-25 52 views
0

我想在10秒內將方法的調用次數限制爲5次。將從不同的線程調用該方法。在那段時間過去之後,我想讓方法的計數器重新設置,以便在接下來的10秒鐘內再打5個電話,並且這個過程會繼續。有什麼可以做到這一點的好方法?在指定的秒內最大線程調用

感謝

+2

你想,如果超過這個限制,會發生什麼?應該拋出一個錯誤或阻止?可以阻擋10秒或更長時間嗎?例如如果您有11個線程在等待,則至少需要20秒才能達到您的限制,假設沒有新消息發生。 –

+0

我想請求等待3秒,然後超過10秒沒有通過。 –

+0

你希望電話是均勻間隔的,還是都可以突然爆發? –

回答

1

也許使用SemaphoreTimer釋放令牌:

public class RateLimitedTask() { 
    private final Timer timer = new Timer(); 
    private final Semaphore semaphore; 
    private final Runnable task; 

    public RateLimitedTask(
      final Runnable task, 
      final int limit, 
      final int delay 
    ) { 
     this.task = task; 
     semaphore = new Semaphore(limit); 

     timer.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       semaphore.release(limit); 
      } 
     }, delay*1000, delay*1000); 
    } 

    public void run() throws InterruptedException { 
     semaphore.acquire(); 
     task.run(); 
    } 
} 
+0

這將工作表示感謝。 –

+0

@SaimDoruklu theres也有一個方法'信號量#獲得'與超時你可以用來拋出3秒的限制異常! – flakes

+0

我會用它謝謝 –