java实现计数器限流
AtomicInteger方式,代码实现
package com.example.demo.limit; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; public class AtomicIntegerServiceTask implements Runnable{ private static AtomicInteger count = new AtomicInteger(0); private String serviceName; AtomicIntegerServiceTask(String serviceName){ this.serviceName = serviceName; } public void run() { if (count.get() >= 5) { System.out.println("请求用户过多,请稍后在试!"); } else { try { System.out.println("Thread " + serviceName + " is working"); count.incrementAndGet(); Thread.sleep(1000); System.out.println("Thread " + serviceName + " is over"); } catch (InterruptedException e) { System.out.println("error ...." + e.getMessage()); } } } }
测试下AtomicIntegerRateLimiter
package com.example.demo.limit; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.ExecutorService; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @Slf4j public class AtomicIntegerRateLimiterDemo { public static void main(String[] args){ ExecutorService executor = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); for(int i = 1 ; i <= 100 ; i++){ AtomicIntegerServiceTask serviceTask = new AtomicIntegerServiceTask("task" + i); executor.submit(serviceTask); } } }
Semaphore方式,代码实现
package com.example.demo.limit; import java.util.concurrent.Semaphore; public class SemaphoreServiceTask implements Runnable{ private static Semaphore semphore = new Semaphore(3); private String serviceName; SemaphoreServiceTask(String serviceName){ this.serviceName = serviceName; } @Override public void run(){ if(semphore.getQueueLength() > 10){ System.out.println("当前等待排队的任务数大于10,请稍候再试..."); return; } try { semphore.acquire(); System.out.println("Thread " + serviceName + " is working"); Thread.sleep(1000); System.out.println("Thread " + serviceName + " is over"); } catch (InterruptedException e) { e.printStackTrace(); }finally { semphore.release(); } } }
测试下SemaphoreCountLimiter
package com.example.demo.limit; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.ExecutorService; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @Slf4j public class SemaphoreCountLimiterDemo { public static void main(String[] args){ ExecutorService executor = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); for(int i = 1 ; i <= 100 ; i++){ SemaphoreServiceTask serviceTask = new SemaphoreServiceTask("task" + i); executor.submit(serviceTask); } } }