CountDownLatch demo演示数据分片多线程处理

# CountDownLatch demo演示数据分片多线程处理
package com.example.core.mydemo;

import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * 打印结果:
 * begin
 * 当前线程名称=pool-1-thread-1
 * 业务逻辑多线程处理,可以按数据集合分片来处理
 * 当前线程名称=pool-1-thread-2
 * 业务逻辑多线程处理,可以按数据集合分片来处理
 * 当前线程名称=pool-1-thread-5
 * 业务逻辑多线程处理,可以按数据集合分片来处理
 * 当前线程名称=pool-1-thread-6
 * 业务逻辑多线程处理,可以按数据集合分片来处理
 * 当前线程名称=pool-1-thread-7
 * 业务逻辑多线程处理,可以按数据集合分片来处理
 * 当前线程名称=pool-1-thread-3
 * 业务逻辑多线程处理,可以按数据集合分片来处理
 * 当前线程名称=pool-1-thread-4
 * 业务逻辑多线程处理,可以按数据集合分片来处理
 * 当前线程名称=pool-1-thread-8
 * 业务逻辑多线程处理,可以按数据集合分片来处理
 * 当前线程名称=pool-1-thread-9
 * 业务逻辑多线程处理,可以按数据集合分片来处理
 * 当前线程名称=pool-1-thread-10
 * 业务逻辑多线程处理,可以按数据集合分片来处理
 * finish
 *
 *
 * 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
 * 用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。
 */
public class CountDownLatchTest {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(10);

        //splitLists 按集合来多线程处理数据
        //通过CountDownLatch 的使用  我们控制了线程的执行顺序
        CountDownLatch countDownLatch = new CountDownLatch(10);

        System.out.println("begin");
        for(int i= 0;i < 10; i++){
//            System.out.println("i=" + i);
            executorService.submit(() -> {
                System.out.println("当前线程名称=" + Thread.currentThread().getName());

                try {
                    //todo
                    System.out.println("业务逻辑多线程处理,可以按数据集合分片来处理");
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    countDownLatch.countDown();
                    System.out.println("countDown-" + Thread.currentThread().getName());
                }
            });
        }

        // 等待所有线程完毕
        try {
            //await() 方法具有阻塞作用
            countDownLatch.await();
            System.out.println("finish");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //结束
        executorService.shutdown();

    }
}

 

posted on 2022-08-23 13:52  oktokeep  阅读(116)  评论(0编辑  收藏  举报