2016-04-25 9 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秒の制限で例外をスローするのに使うことができるタイムアウトで 'Semaphore#acquire'メソッドも使用しています! – flakes

+0

私はそれを感謝します –

関連する問題