栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

CountDownLatch

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

CountDownLatch

示例
		CountDownLatch countDownLatch = new CountDownLatch(10);
        for(int i = 0;i<10;i++){
            Thread thread = new Thread(() -> {

                System.out.println(Thread.currentThread().getName()+"在路上");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"到达");
                countDownLatch.countDown();
            },"男"+i);
            thread.start();
        }
        countDownLatch.await();
        System.out.println("集合完毕");
构造方法和成员变量
public class CountDownLatch {
	//同步器
	private final Sync sync;
	//构造方法,count计数
	public CountDownLatch(int count) {
        if (count < 0) throw new IllegalArgumentException("count < 0");
        this.sync = new Sync(count);
    }
}
内部类

Sync

	private static final class Sync extends AbstractQueuedSynchronizer {
		//构造方法,将count赋值给state,相当于初始化锁数量
        Sync(int count) {
            setState(count);
        }
		//获取剩余state数量
        int getCount() {
            return getState();
        }
		//上锁
        protected int tryAcquireShared(int acquires) {
        	//判断剩余state是否为0,如果小于零,执行doAcquireSharedInterruptibly(arg)方法,放行
            return (getState() == 0) ? 1 : -1;
        }
		//释放锁
        protected boolean tryReleaseShared(int releases) {
            for (;;) {
                int c = getState(); //获取当前剩余锁数量
                if (c == 0) //锁数量为0 
                    return false;
                int nextc = c-1; //锁数量-1
                if (compareAndSetState(c, nextc)) //替换锁数量
                    return nextc == 0; //如果锁数量为0,所有的线程都已完成任务,然后在闭锁上等待的线程就可以恢复执行任务
            }
        }
    }
常用方法

countDown()
countDown方法每次使state减1

	public void countDown() {
        sync.releaseShared(1);
    }

await()
调用await方法的线程会被阻塞,直到state的值为0时线程才会继续执行

	public void await() throws InterruptedException {
        sync.acquireSharedInterruptibly(1);
    }

CountDownLatch可以使一个线程等待其他线程执行完毕后才执行,初始化的时候将传入的count赋值给state,同过countDown()方法每次使state减1,通过await()方法阻塞线程,直至state为0使才放行。countDown()相当于释放锁的过程。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/644676.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号