Java Concurrency: Rate Limiting with Semaphores | Preplyer