使用多线程查询大量数据信息

使用多线程查询大量数据信息

1、创建一个线程池:

public class ThreadPoolExecutorFactory {

    public static final ThreadPoolExecutor executor= new ThreadPoolExecutor(5, 5, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingDeque());


}

2、创建一个CountDownLatch计数器闭锁,通过它可以完成类似于阻塞当前线程的功能,即:一个线程或多个线程一直等待,直到其他线程执行的操作完成。

在线程执行中,当一个线程调用完毕,调用countDown计数器的值减1,当计数器值减至零时,所有因调用await()方法而处于等待状态的线程就会继续往下执行。CountDownLatch的await()方法,等待当前多线程查询结束之后再执行之后的代码逻辑。

List> 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 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,

你可能感兴趣的:(Java)