天天看点

并发实战题(一)

实现一个流控程序。控制客户端每秒调用某个远程服务不超过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));