同步工具类之——Latch

同步工具类除了最熟悉的阻塞队列之外,还包括Semaphore、Barrier以及Latch。同样,我们也可以创建属于自己的同步工具类。所有的同步工具类都包含了一些特定的结构属性:比如,封装了一些状态,而这些状态将决定执行同步工具类的线程是继续执行海蛇等待,除此而外,还提供了一些方法对状态进行操作,以及高效的等待同步工具类进入到预期的状态。
闭锁最形象的比喻是一扇Gate,在闭锁到达结束状态之前,这扇门始终处于关闭的状态,任何线程都无法通过。而当闭锁到达结束状态,这扇门将打开,进而允许所有的线程通过。一旦闭锁达到结束状态,这扇门将保持打开的状态,不会再关闭。换句话说,闭锁的作用是保持某些活动直到其他活动都完成才继续执行。
举个例子,我们都知道并发在某些情况下,可以极大地提升工作效率,缩短程序的运行时间,那么我们该如何去获取并发程序准确的运行时间,即在所有线程全部就绪的时刻启动时间,而在所有线程全部结束的时刻终止时间。Latch可以做到,看下面程序。

public class TestHarness {
    public static String timeTasks(int nThreads,final Runnable[] tasks) throws InterruptedException{
        final CountDownLatch startGate=new CountDownLatch(1);
        final CountDownLatch endGate=new CountDownLatch(nThreads);
        for(Runnable task:tasks){
            Thread t=new Thread(){
                public void run(){
                    try{
                        startGate.await();
                        try{
                            task.run();
                        }finally{
                            //每个线程最终最后执行将endGate减1
                            endGate.countDown();

                        }
                    }catch(InterruptedException e){

                    }
                }
            };
            t.start();
        }
        long startTime=System.nanoTime();
        startGate.countDown();
        endGate.await();
        long endTime=System.nanoTime();
        return "Time: "+(endTime-startTime)+"ns";
    }

由于startGate被设置为等待

startGate.await();

因此每个线程首先要做的工作就是在启动门上等待,知道所有的线程全部就绪。并且,我们在为每个线程装载任务时

finally{endGate.countDown();}

保证没个线程最终都会执行使得endGate减1的任务

startGate.countDown();

注意startGate的初值为1,因此调用countDown方法后,门打开,此时线程开始执行

endGate.await();

endGate此时关闭,要做的工作就是等待且为零的时刻,然后打开


如果没用使用Latch工具而去获取并行线程的运行时间,线程在被创建之后将立即执行,显然,先启动的线程势必会领先于后启动的线程,并且活跃线程的数量会随着时间的推移而慢慢减少或者增加,竞争程度也将发生变化。有了这个工具,我们今后在编写并发程序是,只需要调用timeTasks函数,并向其传递任务参数,就可以获取并发时间了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值