package com.interview.flag.g; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; /** * Created_By: stefanie * Date: 15-2-3 * Time: 上午11:56 */ public class G50_RPSChecker { static class RPSChecker{ private int limitation; private AtomicInteger count = new AtomicInteger(0); private AtomicLong startTimestamp = new AtomicLong(-1); public void setRPS(int count){ this.limitation = count; } public boolean process(long timestamp){ if (timestamp - startTimestamp.get() >= 1000) { count.set(1); startTimestamp.set(timestamp); return true; } else if(count.incrementAndGet() <= limitation) { return true; } return false; } } static class RequestSender implements Runnable{ RPSChecker checker; int id; RequestSender(int id, RPSChecker checker){ this.id = id; this.checker = checker; } @Override public void run() { while(true){ if(checker.process(System.currentTimeMillis())){ System.out.printf("Sender %d sent a request\n", id); } else { System.out.printf("Sender %d request rejected \n", id); } try { TimeUnit.MILLISECONDS.sleep(400); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) throws InterruptedException { RPSChecker checker = new RPSChecker(); checker.setRPS(7); ExecutorService executor = Executors.newCachedThreadPool(); for(int i = 0; i < 5; i++){ executor.execute(new RequestSender(i, checker)); } TimeUnit.SECONDS.sleep(5); System.out.println("Adapt RPS to 15"); checker.setRPS(15); TimeUnit.SECONDS.sleep(5); System.exit(0); } }