CountDownLatch利用

手机游戏开发者 2024-9-1 12:22:08 101 0 来自 中国
之前开发碰到一个场景,须要开启多线程上传图片到阿里云,将以是图片上传完成后,将图片地点一起提交到后端。那么这里就须要监听这些多线程是否全部都实行完成。之前做的是用AtomicInteger来计数,每实行完一个线程,将这个变量+1,然后判定该值是否即是启动的线程数,假如相称了,则表明全部线程实行完毕。那么这种场景还可以直接用CountDownLatch来进行实现。
CountDownLatch是一个同步工具类,它通过一个计数器来实现的,初始值为线程的数目。每当一个线程完成了自己的使命,计数器的值就相应得减1。当计数器到达0时,体现全部的线程都已实行完毕,然后在期待的线程就可以规复实行使命。
方法详解

CountDownLatch(int count):count为计数器的初始值(一样平常须要多少个线程实行,count就设为几)。
countDown(): 每调用一次计数器值-1,直到count被减为0,代表全部线程全部实行完毕。
getCount():获取当前计数器的值。
await(): 期待计数器变为0,即期待全部异步线程实行完毕。
CountDownLatch的利用场景

1.某一线程在开始运行前期待n个线程实行完毕。
2.实现多个线程开始实行使命的最大并行性。
实例:业务线程期待子线程初始化实行完成再实行

public class CountDownLatchUtil {    private static CountDownLatch countDownLatch = new CountDownLatch(6);    public static void main(String args[]) {        for (int i=0;i<5;i++) {            Thread thread = new Thread(new InitThread());            thread.start();        }        Thread thread = new Thread(new BusiThread());        thread.start();    }    private static class InitThread implements Runnable {        @Override        public void run() {            System.out.println(Thread.currentThread().getName() + ":实行初始化使命");            countDownLatch.countDown();        }    }    private static class BusiThread implements Runnable {        @Override        public void run() {            try {                countDownLatch.await();            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println("BusiThread" + "实行业务使命");        }    }}创建5个子线程实行run,run方法中调用countDown方法进行计数-1。同时创建BusiThread使命,在run中调用await,期待计数为0,再实行自己的业务使命。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-23 15:57, Processed in 0.143167 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表