package com.zhoujianpeng.project.Guava.monitor; import com.google.common.base.Stopwatch; import com.google.common.util.concurrent.RateLimiter; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; public class TokenBucket { // private static AtomicInteger phoneNumbers = new AtomicInteger(0); // private final static int LIMIT = 100; // private static final RateLimiter limiter = RateLimiter.create(10); public static int getSaleLimit() { return saleLimit; } // private static int saleLimit; public TokenBucket() { this(LIMIT); } public TokenBucket(int limit) { this.saleLimit = limit; } public static int buy() { Stopwatch started = Stopwatch.createStarted(); //这个的限制--一个线程最多10s boolean success = limiter.tryAcquire(10, TimeUnit.SECONDS); if (success) { if (phoneNumbers.get() > saleLimit) { throw new IllegalStateException("not any phone can be sale ,please wait next to time"); } int phoneNo = phoneNumbers.getAndIncrement(); handleOrder(); System.out.println(Thread.currentThread().getName() + "user get the Mi Phone" + phoneNo + ", ELT" + started.stop()); return phoneNo; } else { started.stop(); throw new RuntimeException("sorry,occur exception when buy phone"); } } private static void handleOrder() { try { TimeUnit.SECONDS.sleep(ThreadLocalRandom.current().nextInt(10)); } catch (InterruptedException e) { e.printStackTrace(); } } }
package com.zhoujianpeng.project.Guava.monitor; import java.util.stream.IntStream; public class TokenBucketExample { public static void main(String[] args) { final TokenBucket tokenBucket = new TokenBucket(); int saleLimit = tokenBucket.getSaleLimit(); System.out.println(saleLimit); IntStream.range(0, 200).forEach(i -> { new Thread(() -> { tokenBucket.buy(); }).start(); }); } }