CountDownLatch 同步器
在构造的时候需要出入一个整数n,在这个整数“倒数”到0之前,主线程需要等待在门口,而这个倒数过程则是各个执行线程驱动的,每个线程执行完任务“倒数”一次
package CountDownLatchDemo;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
//玩家加载器
public class PlayerLoader implements Runnable{
public final static String[] playerNames = new String[]{
"玩家1","玩家2","玩家3","玩家4","玩家5"
};
private static int index = 0;
private String name;
private CountDownLatch cdl;
public PlayerLoader(CountDownLatch cdl) {
this.cdl = cdl;
name = playerNames[index++];
}
@Override
public void run() {
System.out.printf(name + "正在加载中...");
try {
Thread.sleep(new Random().nextInt(2000));
System.out.printf(name + "加载完毕");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
cdl.countDown();
}
}
}
package CountDownLatchDemo;
import Player.Player;
import java.util.concurrent.CountDownLatch;
public class HeroGame {
public static void main(String[] args) throws InterruptedException {
loadPlayer();
System.out.printf("所有的召唤师已上场,游戏开始");
}
private static void loadPlayer() throws InterruptedException {
int heroCount = PlayerLoader.playerNames.length;
CountDownLatch cdl = new CountDownLatch(heroCount);
for (int i = 0; i < heroCount; i++) {
new Thread(new PlayerLoader(cdl)).start();
}
cdl.await();
}
}
玩家1正在加载中...
玩家5正在加载中...
玩家3正在加载中...
玩家4正在加载中...
玩家2正在加载中...
玩家5加载完毕
玩家2加载完毕
玩家3加载完毕
玩家4加载完毕
玩家1加载完毕
所有的召唤师已上场,游戏开始