phaser三个学生做题目
3个学生一起参加考试,一共有三道题,要求所有学生到齐才能开始考试,全部同学都做完第一题,学生才能继续做第二题,
全部学生做完了第二题,才能做第三题,所有学生都做完的第三题,考试才结束
public class StudentRunnable implements Runnable{
Phaser phaser = null;
String name = null;
public StudentRunnable( Phaser phaser , String name ) {
this.phaser = phaser;
this.name = name;
}
@Override
public void run() {
prepare();
phaser.arriveAndAwaitAdvance(); //等待所有的学生到齐
doExercise1();
phaser.arriveAndAwaitAdvance(); //等待所有的学生做完第一道题
doExercise2();
phaser.arriveAndAwaitAdvance(); //等待所有的学生做完第二道题
doExercise3();
phaser.arriveAndAwaitAdvance(); //等待所有的学生做完第三道题
}
private void prepare() {
try {
Thread.sleep(new Random().nextInt());
System.out.println(name + " 准备好了");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void doExercise1() {
try {
Thread.sleep(new Random().nextInt());
System.out.println(name + " 做完第一道题");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void doExercise2() {
try {
Thread.sleep(new Random().nextInt());
System.out.println(name + " 做完第二道题");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void doExercise3() {
try {
Thread.sleep(new Random().nextInt());
System.out.println(name + " 做完第三道题");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* boolean onAdvance(int phase, int registeredParties)方法。
* 此方法有2个作用:
* 1、当每一个阶段执行完毕,此方法会被自动调用,因此,重载此方法写入的代码会在每个阶段执行完毕时执行,
* 2、当此方法返回true时,意味着Phaser被终止,因此可以巧妙的设置此方法的返回值来终止所有线程。
*
*/
public class Client { public static void main(String[] args) {
Phaser phaser = new Phaser() {
@Override
protected boolean onAdvance(int phase, int registeredParties) {
switch (phase) {
case :
return studentArrived();
case :
return finishFirstExercise();
case :
return finishSecondExercise();
case :
return finishExam();
default:
return true;
}
}
private boolean studentArrived(){
System.out.println("学生准备好了,学生人数:"+getRegisteredParties());
return false;
} private boolean finishFirstExercise(){
System.out.println("第一题所有学生做完");
return false;
} private boolean finishSecondExercise(){
System.out.println("第二题所有学生做完");
return false;
} private boolean finishExam(){
System.out.println("第三题所有学生做完,结束考试");
return true;
}
}; List <Thread> threads = new ArrayList<>();
IntStream.range(, ).forEach(i -> {
threads.add(new Thread(new StudentRunnable(phaser, "【学生"+i+"】")));
}); threads.forEach(t -> t.start()); threads.forEach(t -> {
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println("考试结束 "+phaser.isTerminated() );
}
}

phaser三个学生做题目的更多相关文章
- #YCB#待做题目与填坑资料
各种填坑资料(qwq) 主席树(by YL)戳 树套树(by ZSY)戳 不要问我这些题咋来的(查大佬的水表呗) 题目列表: [HDU5977]Garden of Eden [BZOJ2752][HA ...
- 剑指offer题目系列三(链表相关题目)
本篇延续上一篇剑指offer题目系列二,介绍<剑指offer>第二版中的四个题目:O(1)时间内删除链表结点.链表中倒数第k个结点.反转链表.合并两个排序的链表.同样,这些题目并非严格按照 ...
- HTML第三天作业做的表格
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- NetAnalyzer笔记 之 三. 用C++做一个抓包程序
[创建时间:2015-08-27 22:15:17] NetAnalyzer下载地址 经过前两篇的瞎扯,你是不是已经厌倦了呢,那么这篇让我们来点有意思的吧,什么,用C#.不,这篇我们先来C++的 Wi ...
- Good Bye 2016 A. New Year and Hurry【贪心/做题目每道题花费时间按步长为5等差增长,求剩余时间够做几道题】
A. New Year and Hurry time limit per test 1 second memory limit per test 256 megabytes input standar ...
- java例题_50 题目:有五个学生,每个学生有 3 门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成 绩),计算出平均成绩,将原有的数据和计算出的平均分数存放在磁盘文件"stud"中。
1 /*50 [程序 50 文件 IO] 2 题目:有五个学生,每个学生有 3 门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成 3 绩),计算出平均成绩,将原有的数据和计算出的平均分数存放 ...
- 【移动适配】移动Web怎么做屏幕适配(三)
复杂纷扰的世界背后,总会有万变不离其宗的简单规则 啃先生 Mar.8th.2016 壹 | Fisrt 前面写了两篇移动适配相关的文章: <移动Web怎么做屏幕适配(一)>重点介绍了怎样利 ...
- [持久更新] 剑指offer题目Python做题记录
第一题 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:先快速定位到 ...
- Java面试题精选(三) JSP/Servlet Java面试逻辑题
-- JSP/Servlet Java面试逻辑题 -- 很显然,Servlet/JSP的WEB前端动态制作的重要性比HTML/CSS/JS的价值高很多,但我们都知道他们都是建立在HT ...
随机推荐
- python find和index的区别
如果找不到目标元素,index会报错,find会返回-1 >>> s="hello world" >>> s.find("llo&qu ...
- linux管道pipe详解
linux管道pipe详解 https://blog.csdn.net/qq_42914528/article/details/82023408
- MyBatis项目配置案例详解与Web下的增删改查实现[附项目源码]
MyBatis项目案例 项目图示: 项目源码地址:https://github.com/JluTiger/mybatispro 1.项目功能 项目案例:后台管理系统用户数据维护平台 所有用户数据查询 ...
- Thingsboard MQTT连接至服务器
服务器地址加上1883端口号 用户中,需要增加设备的访问令牌 关于设备的访问令牌,可以选择设备的详细信息中,找到访问令牌 动图演示
- Web Worker 使用教程【转】
原文:http://www.ruanyifeng.com/blog/2018/07/web-worker.html 一.概述 JavaScript 语言采用的是单线程模型,也就是说,所有任务只能在一个 ...
- The Matrix | 黑客帝国
今天又刷了一遍,依旧跟第一次看一样,非常惊叹震撼,同时也发现了更多的细节. 梳理一下情节: 开始就是Trinity在matrix里被黑衣人Agent追杀,Trinity团队的目的是寻找Neo,显然Ag ...
- SpringBoot整合Hibernate
编写配置文件 <!--配置读取properties文件--> <context:property-placeholder location="classpath:jdbc. ...
- 微信jaapi签名
public WeiXinJsSignature(string weixinUrl) { //string url = ConfigurationManager.AppSettings["U ...
- 如何发布H5界面可以让公网访问
本文链接:https://blog.csdn.net/u013310119/article/details/81233560问题背景:手机APP里的H5界面要发布到公网,提供给第三方APP调用. 解决 ...
- 为什么一般hashtable的桶数会取一个素数
为什么一般hashtable的桶数会取一个素数 设有一个哈希函数H( c ) = c % N;当N取一个合数时,最简单的例子是取2^n,比如说取2^3=8,这时候H( 11100(二进制) ) = H ...