使用多線程查詢大量數據信息
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,