Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class RpsChecker {
- private final int RATE_PER_SECOND = 1000; //Точность до миллисекунд.
- private long queryTimes[];
- private AtomicInteger lastIndex = new AtomicInteger(0);
- public RpsChecker(int rps) {
- this.queryTimes = new long[rps];
- }
- public boolean isRequestAllowed() {
- long currentTime = System.currentTimeMillis();
- int currentIndex = lastIndex.get();
- if (currentTime - queryTimes[currentIndex] > RATE_PER_SECOND) {
- int nextIndex = getNextIndex(currentIndex);
- while (!lastIndex.compareAndSet(currentIndex, nextIndex)) {
- currentIndex = lastIndex.get();
- if (currentTime - queryTimes[currentIndex] > RATE_PER_SECOND) {
- nextIndex = getNextIndex(currentIndex);
- } else {
- return false;
- }
- }
- queryTimes[currentIndex] = currentTime;
- return true;
- }
- return false;
- }
- private int getNextIndex(int currentIndex) {
- int nextIndex = currentIndex + 1;
- if (nextIndex >= queryTimes.length) {
- nextIndex = 0;
- }
- return nextIndex;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement