做网站需要公司资料吗,人力资源外包服务公司,网上学电脑培训中心,wordpress数据库密码加密多少位CountDownLatch
CountDownLatch允许一个或多个线程等待其他线程完成操作以后#xff0c;再执行当前线程#xff1b;比如我们在主线程需要开启2个其他线程#xff0c;当其他的线程执行完毕以后我们再去执行主线程#xff0c;针对这
个需求我们就可以使用CountDownLatch来进…CountDownLatch
CountDownLatch允许一个或多个线程等待其他线程完成操作以后再执行当前线程比如我们在主线程需要开启2个其他线程当其他的线程执行完毕以后我们再去执行主线程针对这
个需求我们就可以使用CountDownLatch来进行实现。CountDownLatch中count down是倒着数数的意思CountDownLatch是通过一个计数器来实现的每当一个线程完成了自己的
任务后可以调用countDown()方法让计数器-1当计数器到达0时调用CountDownLatch的await()方法的线程阻塞状态解除继续执行。
CountDownLatch的相关方法
public CountDownLatch(int count) // 初始化一个指定计数器的CountDownLatch对象
public void await() throws InterruptedException // 让当前线程等待
public void countDown() // 计数器进行减1案例演示使用CountDownLatch完成上述需求(我们在主线程需要开启2个其他线程当其他的线程执行完毕以后我们再去执行主线程)
实现思路在main方法中创建一个CountDownLatch对象把这个对象作为作为参数传递给其他的两个任务线程
线程任务类1
public class CountDownLatchThread01 implements Runnable {// CountDownLatch类型成员变量private CountDownLatch countDownLatch ;public CountDownLatchThread01(CountDownLatch countDownLatch) { // 构造方法的作用接收CountDownLatch对象this.countDownLatch countDownLatch ;}Overridepublic void run() {try {Thread.sleep(10000);System.out.println(10秒以后执行了CountDownLatchThread01......);} catch (InterruptedException e) {e.printStackTrace();}// 调用CountDownLatch对象的countDown方法对计数器进行-1操作countDownLatch.countDown();}}线程任务类2
public class CountDownLatchThread02 implements Runnable {// CountDownLatch类型成员变量private CountDownLatch countDownLatch ;public CountDownLatchThread02(CountDownLatch countDownLatch) { // 构造方法的作用接收CountDownLatch对象this.countDownLatch countDownLatch ;}Overridepublic void run() {try {Thread.sleep(3000);System.out.println(3秒以后执行了CountDownLatchThread02......);} catch (InterruptedException e) {e.printStackTrace();}// 调用CountDownLatch对象的countDown方法对计数器进行-1操作countDownLatch.countDown();}}测试类
public class CountDownLatchDemo01 {public static void main(String[] args) {// 1. 创建一个CountDownLatch对象CountDownLatch countDownLatch new CountDownLatch(2) ; // CountDownLatch中的计数器的默认值就是2// 2. 创建线程任务类对象并且把这个CountDownLatch对象作为构造方法的参数进行传递CountDownLatchThread01 countDownLatchThread01 new CountDownLatchThread01(countDownLatch) ;// 3. 创建线程任务类对象并且把这个CountDownLatch对象作为构造方法的参数进行传递CountDownLatchThread02 countDownLatchThread02 new CountDownLatchThread02(countDownLatch) ;// 4. 创建线程对象并启动线程Thread t1 new Thread(countDownLatchThread01);Thread t2 new Thread(countDownLatchThread02);t1.start();t2.start();// 5. 在主线程中调用 CountDownLatch中的await让主线程处于阻塞状态try {countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}// 6. 程序结束的输出System.out.println(主线程执行了.... 程序结束了......);}}控制台输出结果
3秒以后执行了CountDownLatchThread02......
10秒以后执行了CountDownLatchThread01......
主线程执行了.... 程序结束了......CountDownLatchThread02线程先执行完毕此时计数器-1CountDownLatchThread01线程执行完毕此时计数器-1当计数器的值为0的时候主线程阻塞状态接触主线程向下执行。