CountDownLatch之countDown()放在子线程的方法里

 CountDownLatch典型用法1:某一线程在开始运行前等待n个线程执行完毕。将CountDownLatch的计数器初始化为n new CountDownLatch(n) ,每当一个任务线程执行完毕,就将计数器减1 countdownlatch.countDown(),当计数器的值变为0时,在CountDownLatch上 await() 的线程就会被唤醒。一个典型应用场景就是启动一个服务时,主线程需要等待多个组件加载完毕,之后再继续执行。


  
  
  1. /**
  2. * CountDownLatch:多线程控制工具类,用来控制线程等待,它可以让某一个线程等待知道倒计时结束,再开始执行
  3. */
  4. public class CountDownLatchDemo {
  5. //实例化并指定计数个数
  6. private static CountDownLatch countDown = new CountDownLatch( 3);
  7. public static Runnable r1 = new Runnable(){
  8. @Override
  9. public void run() {
  10. try{
  11. Thread.sleep( 1000);
  12. System.out.println( "r1 run");
  13. countDown.countDown(); //个数-1
  14. } catch (Exception e){
  15. e.printStackTrace();
  16. }
  17. }
  18. };
  19. public static Runnable r2 = new Runnable() {
  20. @Override
  21. public void run() {
  22. try{
  23. Thread.sleep( 2000);
  24. System.out.println( "r2 run");
  25. countDown.countDown();
  26. } catch (Exception e){
  27. e.printStackTrace();
  28. }
  29. }
  30. };
  31. public static Runnable r3 = new Runnable() {
  32. @Override
  33. public void run() {
  34. try{
  35. Thread.sleep( 1000);
  36. System.out.println( "r3 run");
  37. countDown.countDown();
  38. } catch (Exception e){
  39. e.printStackTrace();
  40. }
  41. }
  42. };
  43. public static void main(String[] args) throws Exception{
  44. System.out.println( "===begin=====");
  45. ExecutorService exec = Executors.newFixedThreadPool( 3);
  46. exec.submit(r1);
  47. exec.submit(r2);
  48. exec.submit(r3);
  49. //等待检查,等待三个线程都执行完成后,主线程才能继续执行
  50. countDown.await();
  51. System.out.println( "====end=====");
  52. exec.shutdown();
  53. }
  54. }

输出结果:


  
  
  1. ===begin=====
  2. r1 run
  3. r3 run
  4. r2 run
  5. ====end=====
                        <li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#csdnc-thumbsup"></use>
                        </svg><span class="name">点赞</span>
                        <span class="count">1</span>
                        </a></li>
                        <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#icon-csdnc-Collection-G"></use>
                        </svg><span class="name">收藏</span></a></li>
                        <li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#icon-csdnc-fenxiang"></use>
                        </svg>分享</a></li>
                        <!--打赏开始-->
                                                <!--打赏结束-->
                                                <li class="tool-item tool-more">
                            <a>
                            <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
                            </a>
                            <ul class="more-box">
                                <li class="item"><a class="article-report">文章举报</a></li>
                            </ul>
                        </li>
                                            </ul>
                </div>
                            </div>
            <div class="person-messagebox">
                <div class="left-message"><a href="https://blog.csdn.net/luzhensmart">
                    <img src="https://profile.csdnimg.cn/E/B/9/3_luzhensmart" class="avatar_pic" username="luzhensmart">
                                            <img src="https://g.csdnimg.cn/static/user-reg-year/2x/8.png" class="user-years">
                                    </a></div>
                <div class="middle-message">
                                        <div class="title"><span class="tit"><a href="https://blog.csdn.net/luzhensmart" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">这瓜保熟么</a></span>
                                            </div>
                    <div class="text"><span>发布了150 篇原创文章</span> · <span>获赞 96</span> · <span>访问量 22万+</span></div>
                </div>
                                <div class="right-message">
                                            <a href="https://im.csdn.net/im/main.html?userName=luzhensmart" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信
                        </a>
                                                            <a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">关注</a>
                                    </div>
                            </div>
                    </div>
    
发布了5 篇原创文章 · 获赞 0 · 访问量 169

 CountDownLatch典型用法1:某一线程在开始运行前等待n个线程执行完毕。将CountDownLatch的计数器初始化为n new CountDownLatch(n) ,每当一个任务线程执行完毕,就将计数器减1 countdownlatch.countDown(),当计数器的值变为0时,在CountDownLatch上 await() 的线程就会被唤醒。一个典型应用场景就是启动一个服务时,主线程需要等待多个组件加载完毕,之后再继续执行。

猜你喜欢

转载自blog.csdn.net/qq_44813090/article/details/104093189