マルチスレッド同時アクセスのSemaphore、CountDownLatch


今日のビジネスニーズ開発には、データを洗浄する小さな機能を開発する必要があります.大体、ビジネスは百万レベルのデータを洗浄する必要があります.小さな機能を開発し、百万データを循環してサービスインタフェースの明確なデータを呼び出す必要があります.インタフェースのコンカレント量を考慮すると、アクセス量があまり大きくないので、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);
    }

    //  
}
このウィジェットは、データ洗浄速度の制御を基本的に実現し、要求されたサービス負荷の過大な異常を防止することができる.