我想在10秒內將方法的調用次數限制爲5次。將從不同的線程調用該方法。在那段時間過去之後,我想讓方法的計數器重新設置,以便在接下來的10秒鐘內再打5個電話,並且這個過程會繼續。有什麼可以做到這一點的好方法?在指定的秒內最大線程調用
感謝
我想在10秒內將方法的調用次數限制爲5次。將從不同的線程調用該方法。在那段時間過去之後,我想讓方法的計數器重新設置,以便在接下來的10秒鐘內再打5個電話,並且這個過程會繼續。有什麼可以做到這一點的好方法?在指定的秒內最大線程調用
感謝
也許使用Semaphore和Timer
釋放令牌:
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();
}
}
你想,如果超過這個限制,會發生什麼?應該拋出一個錯誤或阻止?可以阻擋10秒或更長時間嗎?例如如果您有11個線程在等待,則至少需要20秒才能達到您的限制,假設沒有新消息發生。 –
我想請求等待3秒,然後超過10秒沒有通過。 –
你希望電話是均勻間隔的,還是都可以突然爆發? –