好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java骚操作之CountDownLatch代码详解

简述

用来干嘛的?当你在方法中调用了多个线程,对数据库进行了一些不为人知的操作后,还有一个操作需要留到前者都执行完的重头戏,就需要用到 CountDownLatch 了

实践代码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

package com.github.gleans;

 

import java.util.concurrent.CountDownLatch;

 

public class TestCountDownLatch {

 

   public static void main(String[] args) throws InterruptedException {

     CountDownLatch latch = new CountDownLatch( 3 );

     new KeyPass(1000L, "thin jack" , latch).start();

     new KeyPass(2000L, "noral jack" , latch).start();

     new KeyPass(3000L, "fat jack" , latch).start();

     latch.await();

     System.out.println( "此处对数据库进行最后的插入操作~" );

   }

 

   static class KeyPass extends Thread {

 

     private long times;

 

     private CountDownLatch countDownLatch;

 

     public KeyPass( long times, String name, CountDownLatch countDownLatch) {

       super (name);

       this .times = times;

       this .countDownLatch = countDownLatch;

     }

 

     @Override

     public void run() {

       try {

         System.out.println( "操作人:" + Thread.currentThread().getName()

             + "对数据库进行插入,持续时间:" + this .times / 1000 + "秒" );

         Thread.sleep(times);

         countDownLatch.countDown();

       } catch (InterruptedException e) {

         e.printStackTrace();

       }

     }

   }

}

图解

使用await()提前结束操作

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

package com.github.gleans;

 

import java.util.concurrent.CountDownLatch;

import java.util.concurrent.TimeUnit;

 

public class TestCountDownLatch {

 

   public static void main(String[] args) throws InterruptedException {

     CountDownLatch latch = new CountDownLatch( 3 );

     new KeyPass(2000L, "公司一" , latch).start();

     new KeyPass(3000L, "公司二" , latch).start();

     new KeyPass(5000L, "公司三" , latch).start();

     latch.await( 2 , TimeUnit.SECONDS);

     System.out.println( "~~~贾总PPT巡演~~~~" );

     System.out.println( "~~~~融资完成,撒花~~~~" );

   }

 

   static class KeyPass extends Thread {

 

     private long times;

 

     private CountDownLatch countDownLatch;

 

     public KeyPass( long times, String name, CountDownLatch countDownLatch) {

       super (name);

       this .times = times;

       this .countDownLatch = countDownLatch;

     }

 

     @Override

     public void run() {

       try {

         Thread.sleep(times);

         System.out.println( "负责人:" + Thread.currentThread().getName()

             + "开始工作,持续时间:" + this .times / 1000 + "秒" );

         countDownLatch.countDown();

       } catch (InterruptedException e) {

         e.printStackTrace();

       }

     }

   }

}

假设公司一、公司二、公司三各需要2s、3s、5s来完成工作,贾总等不了,只能等2s,那么就设置await的超时时间

?

1

latch.await( 2 , TimeUnit.SECONDS);

执行结果

负责人:公司一开始工作,持续时间:2秒
~~~贾总PPT巡演~~~~
~~~~融资完成,撒花~~~~
负责人:公司二开始工作,持续时间:3秒
负责人:公司三开始工作,持续时间:5秒

方法描述

总结

这个操作可以说是 简单好用 ,目前还未遇见 副作用 ,若是有大佬,可以告知弟弟一下,提前表示感谢~

到此这篇关于Java骚操作之CountDownLatch的文章就介绍到这了,更多相关Java CountDownLatch内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

原文链接:https://blog.csdn.net/Fine_Cui/article/details/107144502

查看更多关于Java骚操作之CountDownLatch代码详解的详细内容...

  阅读:15次