想象场景
学校开门了学生才能入校,当全部10名学生都入校后打印入校完毕,程序退出
package study;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
public class Test {
public static class myThread extends Thread {
int sleepSeconds;
CountDownLatch doorOpen; // 控制开门
CountDownLatch doorClose; // 控制锁门
public myThread(String name,int seconds,CountDownLatch doorOpen,CountDownLatch doorClose) {
this.setName(name);
this.sleepSeconds = seconds;
this.doorOpen = doorOpen;
this.doorClose = doorClose;
}
@Override
public void run() {
System.out.println(this.getName() + "准备入校");
try {
doorOpen.await();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
long startTime = System.currentTimeMillis();
System.out.println(this.getName() + "开始入校");
try {
TimeUnit.SECONDS.sleep(sleepSeconds);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
long endTime = System.currentTimeMillis();
System.out.println(this.getName() + "入校完毕,耗时:" + String.valueOf(endTime - startTime));
doorClose.countDown();
}
}
}
public static void main(String[] args) throws InterruptedException {
CountDownLatch doorOpen = new CountDownLatch(1);
CountDownLatch doorClose = new CountDownLatch(10);
long start = System.currentTimeMillis();
System.out.println("------学校准备开门了------");
TimeUnit.SECONDS.sleep(5);
doorOpen.countDown(); // 这里就是学校开门操作
for(int index = 0; index < 10; index++) {
new myThread("学生" + String.valueOf(index + 1), 1, doorOpen, doorClose).start();
}
doorClose.await();
long end = System.currentTimeMillis();
System.out.println("所有学生入校完毕,耗时:" + String.valueOf(end - start));
}
}