實作一個流控程式。控制用戶端每秒調用某個遠端服務不超過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));