並發實戰題(一)
實現一個流控程序。控製客戶端每秒調用某個遠程服務不超過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() {
@Override
public void run() {
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));
}
}
文章轉自 並發編程網-ifeve.com
最後更新:2017-05-22 20:04:40