Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.25 KB | None | 0 0
  1. public class RpsChecker {
  2.  
  3.     private final int RATE_PER_SECOND = 1000; //Точность до миллисекунд.
  4.  
  5.     private long queryTimes[];
  6.     private AtomicInteger lastIndex = new AtomicInteger(0);
  7.  
  8.     public RpsChecker(int rps) {
  9.         this.queryTimes = new long[rps];
  10.     }
  11.  
  12.     public boolean isRequestAllowed() {
  13.         long currentTime = System.currentTimeMillis();
  14.         int currentIndex = lastIndex.get();
  15.  
  16.         if (currentTime - queryTimes[currentIndex] > RATE_PER_SECOND) {
  17.             int nextIndex = getNextIndex(currentIndex);
  18.             while (!lastIndex.compareAndSet(currentIndex, nextIndex)) {
  19.                 currentIndex = lastIndex.get();
  20.                 if (currentTime - queryTimes[currentIndex] > RATE_PER_SECOND) {
  21.                     nextIndex = getNextIndex(currentIndex);
  22.                 } else {
  23.                     return false;
  24.                 }
  25.             }
  26.             queryTimes[currentIndex] = currentTime;
  27.             return true;
  28.         }
  29.         return false;
  30.     }
  31.  
  32.     private int getNextIndex(int currentIndex) {
  33.         int nextIndex = currentIndex + 1;
  34.         if (nextIndex >= queryTimes.length) {
  35.             nextIndex = 0;
  36.         }
  37.         return nextIndex;
  38.     }
  39. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement