JAVA中限制接口流量的方法
阿新 • • 發佈:2017-12-27
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中限制接口流量的方法