import com.google.common.util.concurrent.RateLimiter; import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicLong; /** * @author Administrator * 简单实现一个限流器 * Guava 是谷歌开源的工具类库,它提供了RateLimiter作为限流工具类,使用前需要引入它的依赖如下。 */ public class TestLimiter { public static void main(String[] args) throws InterruptedException { TestLimiter testLimiter = new TestLimiter(); testLimiter.method(); } public void method() throws InterruptedException { // 定义限流器流速:1个请求/秒(1s/请求) RateLimiter rateLimiter = RateLimiter.create(1); //给线程池命名 ThreadFactory threadName = new ThreadFactoryBuilder().setNameFormat("ThreadPool-%d").build(); // 创建执行任务的线程池 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10, 1000, TimeUnit.MINUTES, new LinkedBlockingQueue<>(20), threadName, new ThreadPoolExecutor.AbortPolicy()); //可获取当前时间 AtomicLong preTime = new AtomicLong(System.nanoTime()); for (int i = 0; i < 20; i++) { //限流器限流 rateLimiter.acquire(); //线程开始执行,上面是搞得1秒一个请求 threadPoolExecutor.execute(()->{ long nanoTime = System.nanoTime(); System.out.println("nanoTime-preTime = " + (nanoTime - preTime.get())/1000_000+" 线程"+Thread.currentThread().getName()); preTime.set(nanoTime); }); } //设置线程关闭 threadPoolExecutor.shutdown(); //关闭等待时间 threadPoolExecutor.awaitTermination(2000,TimeUnit.MINUTES); } }
设计一个限流器:大厂面试题
于 2022-10-29 00:43:43 首次发布