java使用CountDownLatch将一个任务拆解后合并处理

简介: java使用CountDownLatch将一个任务拆解后合并处理

一、事例代码

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
import java.util.logging.Logger;
 
public class CountDownLatchTest {
    //创建同步器
    private static CountDownLatch countDownLatch = new CountDownLatch(5);
 
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        //记录并打印开始时间
        long start = System.currentTimeMillis();
        System.out.println("startTima:"+start);
        //分拆任务后返回结果存放集合
        List<String> resList = new ArrayList<>();
        //创建固定大小线程池
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        //创建多个Callable接口的实现
        CallAble can5 = new CallAble(4, countDownLatch, "我是线程5");
        CallAble can4 = new CallAble(4, countDownLatch, "我是线程4");
        CallAble can3 = new CallAble(3, countDownLatch, "我是线程3");
        CallAble can2 = new CallAble(2, countDownLatch, "我是线程2");
        CallAble can1 = new CallAble(1, countDownLatch, "我是线程1");
        //提交线程任务
        Future<List<String>> submit5 = executorService.submit(can5);
        Future<List<String>> submit4 = executorService.submit(can4);
        Future<List<String>> submit3 = executorService.submit(can3);
        Future<List<String>> submit2 = executorService.submit(can2);
        Future<List<String>> submit1 = executorService.submit(can1);  
        //等待所有线程返回结果
        countDownLatch.await();
        //将子线程结果添加到返回值集合
        resList.addAll(submit5.get());
        resList.addAll(submit4.get());
        resList.addAll(submit3.get());
        resList.addAll(submit2.get());
        resList.addAll(submit1.get());
        //销毁线程池
        executorService.shutdown();
        System.out.println("+++++++++++++++");
        //打印子线程结果
        resList.forEach(temm -> System.out.println(temm));
        //打印结果集大小
        System.out.println("temList.size:"+resList.size());
        //记录并打印结束时间
        long end = System.currentTimeMillis();
        System.out.println("endtime:"+end);
        System.out.println("总耗时:"+(end-start)/1000+"s");        
    }
}
//实现callable接口的实现类
class CallAble implements Callable<List<String>> {
    Logger log = Logger.getLogger("log");
    private int nun;
    //定义同步量
    private CountDownLatch cdl;
    //定义线程名称
    private String name;
    //构造方法
    public CallAble(int num, CountDownLatch countDownLatch, String name) {
        this.nun = num;
        this.cdl = countDownLatch;
        this.name = name;
    }
 
    @Override
    //实现callable接口call方法
    public List<String> call() throws Exception {
        //定义返回结果
        List<String> list = new ArrayList<>();
        System.out.println(Thread.currentThread().getName());
        try {
            //业务操作或者数据库的操作
            list.add(String.valueOf(this.nun));
            list.add(name);
            //程序休眠num秒
            Thread.sleep(this.nun*1000);
            System.out.println(name);
//            log.info(name);
        } finally {
            //计数器减一
            cdl.countDown();
        }
        return list;
    }
}

二、运行截图

相关文章
|
2月前
|
Java 开发者
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
37 0
|
6天前
|
算法 Java
JAVA并发编程系列(8)CountDownLatch核心原理
面试中的编程题目“模拟拼团”,我们通过使用CountDownLatch来实现多线程条件下的拼团逻辑。此外,深入解析了CountDownLatch的核心原理及其内部实现机制,特别是`await()`方法的具体工作流程。通过详细分析源码与内部结构,帮助读者更好地理解并发编程的关键概念。
|
2月前
|
缓存 Java 调度
Java并发编程:深入解析线程池与Future任务
【7月更文挑战第9天】线程池和Future任务是Java并发编程中非常重要的概念。线程池通过重用线程减少了线程创建和销毁的开销,提高了资源利用率。而Future接口则提供了检查异步任务状态和获取任务结果的能力,使得异步编程更加灵活和强大。掌握这些概念,将有助于我们编写出更高效、更可靠的并发程序。
|
2月前
|
消息中间件 NoSQL Java
使用Java实现分布式任务调度器
使用Java实现分布式任务调度器
|
1天前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
11 5
消息中间件 缓存 监控
75 0
|
1月前
|
Java
Java系列之 超时任务处理方法
这篇文章介绍了Java中处理超时任务的方法,通过使用`FutureTask`和`ExecutorService`来异步执行可能耗时的任务,并设置超时时间,如果任务在指定时间内未完成,则主动结束任务并返回默认结果。
Java系列之 超时任务处理方法
|
1月前
|
Java
|
2月前
|
Java Linux
Java演进问题之1:1线程模型对于I/O密集型任务如何解决
Java演进问题之1:1线程模型对于I/O密集型任务如何解决
|
2月前
|
Java 测试技术 开发者
Java面试题:解释CountDownLatch, CyclicBarrier和Semaphore在并发编程中的使用
Java面试题:解释CountDownLatch, CyclicBarrier和Semaphore在并发编程中的使用
53 11