package com.example.demo;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
/**
* description
*
* @author xichengxml
* @date 2020-10-28 11:30:17
*/
@Slf4j
public class SemaphoreTest {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
final Semaphore semaphore = new Semaphore(5);
for (int i = 0; i < 20; i++) {
executorService.submit(() -> {
try {
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("{} running...", Thread.currentThread().getName());
try {
TimeUnit.SECONDS.sleep(1);
semaphore.release();
log.info("available permits: {}", semaphore.availablePermits());
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
}
同样可以通过guava的ratelimiter来实现
package com.example.demo;
import com.google.common.util.concurrent.RateLimiter;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* description
*
* @author xichengxml
* @date 2020-10-28 15:47:10
*/
@Slf4j
public class RateLimiterTest {
public static void main(String[] args) {
RateLimiter rateLimiter = RateLimiter.create(5);
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 20; i++) {
executorService.submit(() -> {
rateLimiter.acquire(1);
log.info("{} running...", Thread.currentThread().getName());
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
}