JAVA中限制接口流量、并发的方法
生活随笔
收集整理的這篇文章主要介紹了
JAVA中限制接口流量、并发的方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、RateLimiter類
RateLimiter翻譯過來是速率限制器,使用的是一種叫令牌桶的算法,當線程拿到桶中的令牌時,才可以執行。通過設置每秒生成的令牌數來控制速率。使用例子如下:
public class TestRateLimiter implements Runnable {public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public static final RateLimiter limiter = RateLimiter.create(1); // 允許每秒最多1個任務public static void main(String[] arg) {for (int i = 0; i < 10; i++) {limiter.acquire(); // 請求令牌,超過許可會被阻塞Thread t = new Thread(new TestRateLimiter());t.start();}}public void run() {System.out.println(sdf.format(new Date()) + " Task End..");} }二、Semaphore類
Semaphore翻譯過來是信號量,通過設置信號量總數,當線程拿到信號量,才可以執行,當實行完畢再釋放信號量。從而控制接口的并發數量。使用例子如下:
public class TestSemaphore implements Runnable {public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public static final Semaphore semaphore = new Semaphore(5, true); // 允許并發的任務量限制為5個public static void main(String[] arg) {for (int i = 0; i < 10; i++) {Thread t = new Thread(new TestSemaphore());t.start();}}public void run() {try {semaphore.acquire(); // 獲取信號量,不足會阻塞System.out.println(sdf.format(new Date()) + " Task Start..");Thread.sleep(5000);System.out.println(sdf.format(new Date()) + " Task End..");} catch (InterruptedException e) {e.printStackTrace();} finally {semaphore.release(); // 釋放信號量}} }?
總結
以上是生活随笔為你收集整理的JAVA中限制接口流量、并发的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java高并发系统的限流策略
- 下一篇: spring boot整合redis实现