マルチスレッド同時アクセスのSemaphore、CountDownLatch
4476 ワード
今日のビジネスニーズ開発には、データを洗浄する小さな機能を開発する必要があります.大体、ビジネスは百万レベルのデータを洗浄する必要があります.小さな機能を開発し、百万データを循環してサービスインタフェースの明確なデータを呼び出す必要があります.インタフェースのコンカレント量を考慮すると、アクセス量があまり大きくないので、1、2時間でコンカレント制御の小さなプログラムを作りました.
public static class CleanTask implements Runnable {
private static Semaphore semaphore = new Semaphore(5, true);
private Runnable runnable;
private CountDownLatch latch;
public CleanTask(CountDownLatch latch, Runnable runnable) {
this.runnable = runnable;
this.latch = latch;
}
@Override
public void run() {
try {
semaphore.acquire();
runnable.run();
semaphore.release();
} catch (InterruptedException ex) {
LOG.error(" ", ex);
} finally {
latch.countDown();
}
}
}
public static void cleanStockData(List stringList) {
ExecutorService executorService = Executors.newCachedThreadPool();
CountDownLatch countDownLatch = new CountDownLatch(stringList.size());
for (String id : stringList) {
executorService.submit(new CleanTask(countDownLatch, () -> {
try {
//
} catch (Exception ex) {
// case
}
}));
}
try {
countDownLatch.await();
} catch (InterruptedException ex) {
LOG.error(" ", ex);
}
//
}
このウィジェットは、データ洗浄速度の制御を基本的に実現し、要求されたサービス負荷の過大な異常を防止することができる.