package com.zhoujianpeng.project.Guava.monitor.rate; import com.google.common.util.concurrent.RateLimiter; import java.util.concurrent.*; import java.util.stream.IntStream; /** * */ public class ReateLimiterExample { /** * 1s内只能有两个请求进来,两个请求就是两个线程,这个就是并发请求 * 对请求次数的限制,那么怎么做到对请求次数的不限制呢?\ * 一秒钟有多少个操作 * 一秒钟之内只能有0.5次的操作,也就是说2秒之内有一次请求 * 一秒内允许多少次操作,可以是一个线程,也可以是多个贤臣 */ private final static RateLimiter limter = RateLimiter.create(0.5d); //同时的并发访问量为3个线程,而这个访问量指的是当前必须锁定这段代码,并且前后加上关键字 //同一时刻,并发访问量是3对于同于一个接口或者同一段代码 private final static Semaphore semphore = new Semaphore(3); private static void testLimiter() { System.out.println("请求时间--" + System.currentTimeMillis() + "线程名称" + Thread.currentThread().getName() + "---waitting---" + limter.acquire()); } private static void testSemphore() { try { semphore.acquire(); System.out.println("请求时间--" + System.currentTimeMillis() + "线程名称" + Thread.currentThread().getName() + "" + "is comming and do work"); //这里的thread.sleep只是为了模仿业务逻辑,因为真正的业务逻辑这里是需要一段时间去执行的 TimeUnit.SECONDS.sleep(ThreadLocalRandom.current().nextInt(10)); } catch (InterruptedException e) { e.printStackTrace(); } finally { semphore.release(); System.out.println("请求时间--" + System.currentTimeMillis() + "线程名称" + Thread.currentThread().getName() + "" + "is release and do work"); } } public static void main(String[] args) { //这个是这个池子的容纳量 ExecutorService executorService = Executors.newCachedThreadPool(); IntStream.range(0, 10).forEach(i -> //这个是这个池子中的线程同时的并发量 executorService.submit(ReateLimiterExample::testLimiter) ); } }
RateLimiter和Semphore的比较
最新推荐文章于 2024-05-11 00:40:09 发布