实现一个流控程序。控制客户端每秒调用某个远程服务不超过n次,客户端是会多线程并发调用,需要一个轻量简洁的实现,大家看看下面的一个实现,然后可以自己写一个实现。
import java.util.date;
import java.util.concurrent.executorservice;
import java.util.concurrent.executors;
import java.util.concurrent.semaphore;
import java.util.concurrent.timeunit;
public class test {
final static int max_qps = 10;
final static semaphore semaphore = new semaphore(max_qps);
public static void main (string ... args) throws exception {
executors.newscheduledthreadpool(1).scheduleatfixedrate(new runnable() {
@override
public void run() {
semaphore.release(max_qps/2);
}
}, 1000, 500, timeunit.milliseconds);
//lots of concurrent calls:100 * 1000
executorservice pool = executors.newfixedthreadpool(100);
for (int i=100;i>0;i--) {
final int x = i;
pool.submit(new runnable() {
for (int j=1000;j>0;j--) {
semaphore.acquireuninterruptibly(1);
remotecall(x, j);
});
pool.shutdown();
pool.awaittermination(1, timeunit.hours);
system.out.println("done");
private static void remotecall(int i, int j) {
system.out.println(string.format("%s - %s: %d %d",new date(),
thread.currentthread(), i, j));