CountDownLatch 的 getCount()方法不能作为循环条件

本文探讨了CountDownLatch的getCount()方法为何不适合用作循环条件的原因。通过实例展示,当线程执行countDown()方法时,会导致计数值变化,进而影响到主线程的循环次数,可能导致程序陷入无限等待。
摘要由CSDN通过智能技术生成

CountDownLatch 的 getCount()方法不能作为循环条件

package com.deejing.countDownLatch;

import java.util.concurrent.CountDownLatch;

public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(60);
        //FutureTask<String> task = new FutureTask<>(new MyThread(latch));
        MyThread thread = new MyThread(latch);
        System.out.println(latch.getCount());//第一次输出count值
        for (int i = 0; i < latch.getCount(); i++) {
            new Thread(thread).start();
        }
        System.out.println(latch.getCount());//创建完线程输出count值
        new Thread(new MyThread2(latch)).start();

        latch.await();
        System.out.println("所有线程都准备好了");
    }
}

class MyThread implements Runnable {
    private CountDownLatch latch;

    public MyThread(CountDownLatch latch) {
        this.latch = latch;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "已经准备好了");
        latch.countDown();//计数器-1
    }
}



class MyThread2 implements Runnable {
    private CountDownLatch countDownLatch;

    public MyThread2(CountDownLatch countDownLatch) {
        this.countDownLatch = countDownLatch;
    }

    @Override
    public void run() {
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("唤醒另外一个线程");
    }
}

在这里插入图片描述

前后两次输出的count值已经减少了

在主线程里的for循环条件是CountDownLatch中的getCount()方法返回的值,每次进入循环都会执行一次getCount,因为在下面新创建的线程中会执行countDown()方法,会导致count的值被修改,就会导致循次数比计数器的要小,count永远不会达到0,导致主线程和另外一个线程永远处于阻塞状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值