多线程分页处理数据(主线程阻塞直到所有子线程处理完毕并接收返回结果)

本文探讨了两种多线程处理分页数据的方法,包括使用FixedThreadPool和CountDownLatch的方案一,以及采用CachedThreadPool结合awaitTermination和isTerminated的方案二。在每种方案中,主线程都会阻塞直到所有子线程完成处理并返回结果。重点介绍了CountDownLatch的工作原理和awaitTermination、isTerminated的方法作用。
摘要由CSDN通过智能技术生成

方案一

备注:将数据分页,以FixedThreadPool(定长线程池)+CountDownLatch(并发流程控制)+Callable(有返回值的多线程) + Future(接收Callable的返回值)的形式进行多线程处理数据。其中CountDownLatch的工作原理:在初始化时传入子线程数量,主线程调用await()方法阻塞主线程直到CountDownLatch的技术为0,而使减计数的方法,是在子线程中传入CountDownLatch并在逻辑处理完毕后调用countDown()方法,使其计数减1,当所有线程处理完毕时,计数也将减为0,从而使阻塞的主线程继续运行。

实现方法


public class ThreadsTest {

    public void test() {
        // 需要处理的数据
        List<Object> dataList = new ArrayList<>();

        // 每条子线程处理数据的数量
        int count = 300;
        // 需要处理的数据总量
        int listSize = dataList.size();
        // 开启的线程数
        int runThreadSize = (listSize / count) + 1;
        // 创建一个线程池,数量和开启线程的数量一样
        ExecutorService executor = Executors.newFixedThreadPool(runThreadSize);
        // 用于记录返回结果
        List<Future<Object>> resultList = new ArrayList<>();
        // 计数君~用于阻塞主线程,使得主线程可以等子线程全部处理完成后再返回结果
        CountDownLatch countDownLatch = new CountDownLatch(runThreadSize);

        for (int i = 0; i < runThreadSize; i++) {
            // 本次循环子线程需要处理的数据
            List<Object> newlist = null;
            if ((i + 1) == runThreadSize) {
                // 最后一次分组可能不满count数量,所以特殊处理
                int startIndex;
                startIndex = (i * count);
                int endIndex = dataList.size();
                newlist = dataList.subList(startIndex, endIndex);
            } else {
                int startIndex = (i * count);
                int endIndex = (i + 1) * co
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值