Multi-Th:同步工具类-闭锁

闭锁

闭锁是一种同步工具类,可以延迟线程的进度直到线程到达终止状态。可以用于确保某些活动直到其他活动都完成后继续执行:

  • 确保某个计算在其需要的所有资源都被初始化之后继续执行
  • 确保某个服务在其依赖的所有其他服务都已经启动之后才启动。
  • 等待直到某个操作的所有参与者都就绪再继续执行。

闭锁就像是一扇门,在闭锁到达结束状态之前,这扇门一直关闭的,并且没有任何线程能够通过,当到达结束状态时,这扇门会打开并允许所有的线程通过。(当闭锁到达结束状态后,将不会再改变状态)


CountDownLatch 是一种灵活的闭锁实现,可以使一个或多个线程等待一组事件发生。闭锁状态包括一个计数器,该计数器被初始化成为一个正数,表示需要等待的事件数量。countDown 方法递减计数器,表示有一个事件已经发生。await 方法等待计数器到达零,这表示所有需要等待的事件都已经发生。

public class TestHarness {

    public long timeTask(int nThreads, final Runnable task) throws InterruptedException{
        final CountDownLatch startGate = new CountDownLatch(1);
        final CountDownLatch endGate = new CountDownLatch(nThreads);

        for (int i=0; i<nThreads; i++) {
            new Thread(){
                @Override
                public void run() {
                    try {
                        startGate.await();
                        try {
                            task.run();
                        } finally {
                            endGate.countDown();
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }

        long startTime = System.nanoTime();
        startGate.countDown();
        endGate.await();
        long endTime = System.nanoTime();
        return endTime - startTime;
    }

    public static void main(String[] args) throws InterruptedException {
        long time = new TestHarness().timeTask(10, new Runnable() {
            public void run() {
                System.out.println("Current Thread : " + Thread.currentThread().getName());
            }
        });

        System.out.println("Task execute time : " + time);
    }
}
结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在上一篇 java并发编程——内存模型中我们提到:并发编程中,我们需要处理两个关键问题:线程之间如何通信和线程之间...
    陈晨_Fly阅读 4,093评论 0 8
  • 5.1 同步容器类 同步容器类包括Vector和HashTable以及Collection.synchronize...
    大海孤了岛阅读 2,953评论 1 0
  • ReentrantReadWriteLock 概述 严格来说 ReentrantReadWriteLock 是锁,...
    PFF阅读 3,388评论 0 0
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,486评论 11 349
  • 当你的身边是一群聪明且勤奋的人,你除了一样勤奋还有别的选择吗? 成为一个勤于思考的人是当年老师和父母的耳提面命,但...
    项武君阅读 1,324评论 0 1

友情链接更多精彩内容