天天看點

并發實戰題(一)

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