是这样的,今天看看了看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(""); 程序就能正常执行,加上同步代码块也是可以的~ 为什么?大神求解