1. 程式人生 > >JAVA中限制接口流量的方法

JAVA中限制接口流量的方法

format 阻塞 java create orm ase test iter() nts

  JAVA中限制接口流量可以通過Guava的RateLimiter類或者JDK自帶的Semaphore類來實現,兩者有點類似,但是也有區別,要根據實際情況使用。簡單來說,

RateLimiter類是控制以一定的速率訪問接口。

Semaphore類是控制允許同時並發訪問接口的數量。

一、RateLimiter類

  RateLimiter翻譯過來是速率限制器,使用的是一種叫令牌桶的算法,當線程拿到桶中的令牌時,才可以執行。通過設置每秒生成的令牌數來控制速率。使用例子如下:

 1 public class TestRateLimiter implements Runnable {
2 3 public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 4 5 public static final RateLimiter limiter = RateLimiter.create(1); // 允許每秒最多1個任務 6 7 public static void main(String[] arg) { 8 for (int i = 0; i < 10; i++) { 9 limiter.acquire(); //
請求令牌,超過許可會被阻塞 10 Thread t = new Thread(new TestRateLimiter()); 11 t.start(); 12 } 13 } 14 15 public void run() { 16 System.out.println(sdf.format(new Date()) + " Task End.."); 17 } 18 }

二、Semaphore類

  Semaphore翻譯過來是信號量,通過設置信號量總數,當線程拿到信號量,才可以執行,當實行完畢再釋放信號量。從而控制接口的並發數量。使用例子如下:

 1 public class TestSemaphore implements Runnable {
 2 
 3     public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 4     
 5     public static final Semaphore semaphore = new Semaphore(5, true); // 允許並發的任務量限制為5個
 6     
 7     public static void main(String[] arg) {
 8         for (int i = 0; i < 10; i++) {
 9              Thread t = new Thread(new TestSemaphore());
10              t.start();
11         }
12     }
13 
14     public void run() {
15         try {
16             semaphore.acquire(); // 獲取信號量,不足會阻塞
17             System.out.println(sdf.format(new Date()) + " Task Start..");
18             Thread.sleep(5000);
19             System.out.println(sdf.format(new Date()) + " Task End..");
20         } catch (InterruptedException e) {
21             e.printStackTrace();
22         } finally {
23             semaphore.release(); // 釋放信號量
24         }
25     }
26 }

  初始化中的第二個參數true代表以公平的方式獲取信號量,即先進先出的原則。

JAVA中限制接口流量的方法