使用多線程查詢大量數據信息

使用多線程查詢大量數據信息

1、創建一個線程池:

public class ThreadPoolExecutorFactory {

    public static final ExecutorService executor = Executors.newFixedThreadPool(20);


}

2、創建一個CountDownLatch計數器閉鎖,通過它可以完成類似於阻塞當前線程的功能,即:一個線程或多個線程一直等待,直到其他線程執行的操作完成。

在線程執行中,當一個線程調用完畢,調用countDown計數器的值減1,當計數器值減至零時,所有因調用await()方法而處於等待狀態的線程就會繼續往下執行。CountDownLatch的await()方法,等待當前多線程查詢結束之後再執行之後的代碼邏輯。

List<Map<String, Object>> namespaceData = new CopyOnWriteArrayList<>();
        if (!CollectionUtils.isEmpty(namespaceList)) {
            // 查詢namespace信息
            CountDownLatch countDownLatchApp = new CountDownLatch(namespaceList.size());
            for (NamespaceLocal namespace : namespaceList) {
                ThreadPoolExecutorFactory.executor.execute(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Map<String, Object> namespaceDetail = getNamespaceQuota(namespace.getNamespaceName());
                            if (namespaceDetail != null) {
                                namespaceDetail.put(CommonConstant.NS_ALIASNAME, namespace.getAliasName());
                                namespaceDetail.put(CommonConstant.TENANT_ID, namespace.getTenantId());

                                namespaceData.add(namespaceDetail);
                            }
                        } catch (Exception e) {
                            logger.error("獲取分區配額失敗", e);
                        } finally {
                            countDownLatchApp.countDown();
                        }
                    }
                });
            }
            countDownLatchApp.await();

CountDownLatch詳情可參考https://www.jianshu.com/p/bb5105303d85,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章