作者:一粟
实现一个流控程序。控制客户端每秒调用某个远程服务不超过N次,客户端是会多线程并发调用,需要一个轻量简洁的实现,大家看看下面的一个实现,然后可以自己写一个实现。
01 | import java.util.Date; |
03 | import java.util.concurrent.ExecutorService; |
05 | import java.util.concurrent.Executors; |
07 | import java.util.concurrent.Semaphore; |
09 | import java.util.concurrent.TimeUnit; |
13 | final static int MAX_QPS = 10 ; |
15 | final static Semaphore semaphore = new Semaphore(MAX_QPS); |
17 | public static void main (String ... args) throws Exception { |
19 | Executors.newScheduledThreadPool( 1 ).scheduleAtFixedRate( new Runnable() { |
25 | semaphore.release(MAX_QPS/ 2 ); |
29 | }, 1000 , 500 , TimeUnit.MILLISECONDS); |
32 | ExecutorService pool = Executors.newFixedThreadPool( 100 ); |
34 | for ( int i= 100 ;i> 0 ;i--) { |
38 | pool.submit( new Runnable() { |
44 | for ( int j= 1000 ;j> 0 ;j--) { |
46 | semaphore.acquireUninterruptibly( 1 ); |
59 | pool.awaitTermination( 1 , TimeUnit.HOURS); |
61 | System.out.println( "DONE" ); |
64 | private static void remoteCall( int i, int j) { |
65 | System.out.println(String.format( "%s - %s: %d %d" , new Date(), |
66 | Thread.currentThread(), i, j)); |