/** * Record a new event. */ public void mark() { final long currentTimeMillis = clock.currentTimeMillis(); synchronized (queue) { if (queue.size() == capacity) { /* * we're all filled up already, let's dequeue the oldest * timestamp to make room for this new one. */ queue.removeFirst(); } queue.addLast(currentTimeMillis); } }
/** * Returns a count of in-window events. * * @return the the count of in-window events. */ public int tally() { long currentTimeMillis = clock.currentTimeMillis(); // calculates time for which we remove any errors before final long removeTimesBeforeMillis = currentTimeMillis - windowMillis; synchronized (queue) { // drain out any expired timestamps but don't drain past empty while (!queue.isEmpty() && queue.peek() < removeTimesBeforeMillis) { queue.removeFirst(); } return queue.size(); } }