能够做简历的网站,怎样建设小游戏网站,浏览器无法打开住房和建设网站,word模板免费下载CountDownLatch
翻译#xff1a;
倒计时锁存器#xff0c;#xff0c;#xff0c;#xff0c;count计数#xff0c;down停止#xff0c;Latch锁
解释#xff1a;
允许一个或多个线程等待#xff0c;直到在其他线程中执行的一组操作完成的同步辅助不懂#xff1f;…CountDownLatch
翻译
倒计时锁存器count计数down停止Latch锁
解释
允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助不懂就是正常情况下多线程是同时处于就绪状态但是使用了之后我【线程一】先跑你们在外面候着
方法 使用 简单使用 public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch new CountDownLatch(10);for (int i 0; i 10; i) {int finalI i;new Thread(()-{System.out.println(finalI);countDownLatch.countDown();}).start();}countDownLatch.await();System.out.println(结束了);
}在线程里使用每次减少 1await后面的进程需要等到上面的进程执行完毕才可以执行
问题
如何使用CountDownLatch使得角色裁判喊完各就位预备后发枪这个两个动作后运动员才开始跑
需要使用callable接口而不是runnable接口 复杂使用 裁判类 【Judge】
class Judge implements CallableString{private CountDownLatch startCreamLatch;private CountDownLatch startFireLatch;public Judge(CountDownLatch startCreamLatch, CountDownLatch startFireLatch) {this.startCreamLatch startCreamLatch;this.startFireLatch startFireLatch;}Overridepublic String call() throws Exception {scream();this.startCreamLatch.countDown();this.startCreamLatch.await();fire();this.startFireLatch.countDown();this.startFireLatch.await();return 裁判发枪成功;}public void scream (){System.out.println(裁判喊各就位);}public void fire(){System.out.println(开枪);}
}定义了scream的CountDownLatch 和 fire的 CountDownLatch在主类中分别设置倒计时为1每次执行完即可以执行下一个
运动员类【runner】
class Runner implements CallableString{private CountDownLatch startLatch;public Runner(CountDownLatch startLatch) {this.startLatch startLatch;}Overridepublic String call() throws Exception {this.startLatch.await();run();return Thread.currentThread().getName() 运动员正在运动;}public void run(){System.out.println(Thread.currentThread().getName()运动员跑起来了);}
}主线程【main】
public class Game{public static void main(String[] args) {CountDownLatch startCreamLatch new CountDownLatch(1);CountDownLatch startFireLatch new CountDownLatch(1);Judge judge new Judge(startCreamLatch,startFireLatch);Runner runner new Runner(startFireLatch);FutureTask futureTask new FutureTask(judge);new Thread(futureTask).start();for (int i 0; i 8; i) {FutureTask task new FutureTask(runner);new Thread(task,第String.valueOf(i)运动员).start();}}
}