閱讀495 返回首頁    go 阿裏雲 go 技術社區[雲棲]


並發實戰題(一)

實現一個流控程序。控製客戶端每秒調用某個遠程服務不超過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

  上一篇:go  Java 8新的時間日期庫的20個使用示例
  下一篇:go  避免死鎖