ws12651 2015-09-01 14:24 采纳率: 0%
浏览 1518

发现了一个奇怪的问题,大神求解?

是这样的,今天看看了看Java并发包的CountDownLatch类,线程递减锁,然后直接模拟了一下这个类,贴代码

任务类

 public class Task implements Runnable{

    public String name;
    public CountDown countDown;

    public Task(String name,CountDown countDown) {
        this.name = name;
        this.countDown = countDown;
    }
    @Override
    public void run() {
        try {
            System.out.println(name + "start task");
            Long time = new Random().nextInt(10)*1000L;
            Thread.sleep(time);
            System.out.println(name + "end the task" + "spend" + time/1000+"秒");
            countDown.count();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

这个是模拟的CountDownLatch类 核心逻辑可能不一样,我是按照我的想法去写的


public class CountDown {
    public int index ;
    public CountDown(int index) {
        this.index = index;
    }
    public void count(){
        index = index-1;
        System.out.println(index);
    }
    public void await(){


        while(true){
                //System.out.print("");

            /*synchronized (CountDown.class) {
            }*/
                if (index==0) {
                    break;
                }   
        }
    }

}

主方法类


public class Test {
    public static void main(String[] args) {
        CountDown countDown = new CountDown(4);

        Task task1 = new Task("11111", countDown);
        Task task2 = new Task("22222", countDown);
        Task task3 = new Task("33333", countDown);
        Task task4 = new Task("44444", countDown);

        System.out.println("开始任务");

        new Thread(task1).start();
        new Thread(task2).start();
        new Thread(task3).start();
        new Thread(task4).start();

        countDown.await();

        System.out.println("大家都完成任务了吧~");
    }
}

好,问题是CountDown类的await方法中死循环到条件是不会跳出的,但是在死循环里加上一句毫无意义的System.out.print(""); 程序就能正常执行,加上同步代码块也是可以的~ 为什么?大神求解

  • 写回答

3条回答 默认 最新

  • devmiao 2015-09-01 14:52
    关注
    评论

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?