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三个学生做题目的更多相关文章

  1. #YCB#待做题目与填坑资料

    各种填坑资料(qwq) 主席树(by YL)戳 树套树(by ZSY)戳 不要问我这些题咋来的(查大佬的水表呗) 题目列表: [HDU5977]Garden of Eden [BZOJ2752][HA ...

  2. 剑指offer题目系列三(链表相关题目)

    本篇延续上一篇剑指offer题目系列二,介绍<剑指offer>第二版中的四个题目:O(1)时间内删除链表结点.链表中倒数第k个结点.反转链表.合并两个排序的链表.同样,这些题目并非严格按照 ...

  3. HTML第三天作业做的表格

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  4. NetAnalyzer笔记 之 三. 用C++做一个抓包程序

    [创建时间:2015-08-27 22:15:17] NetAnalyzer下载地址 经过前两篇的瞎扯,你是不是已经厌倦了呢,那么这篇让我们来点有意思的吧,什么,用C#.不,这篇我们先来C++的 Wi ...

  5. 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 ...

  6. java例题_50 题目:有五个学生,每个学生有 3 门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成 绩),计算出平均成绩,将原有的数据和计算出的平均分数存放在磁盘文件"stud"中。

    1 /*50 [程序 50 文件 IO] 2 题目:有五个学生,每个学生有 3 门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成 3 绩),计算出平均成绩,将原有的数据和计算出的平均分数存放 ...

  7. 【移动适配】移动Web怎么做屏幕适配(三)

    复杂纷扰的世界背后,总会有万变不离其宗的简单规则 啃先生 Mar.8th.2016 壹 | Fisrt 前面写了两篇移动适配相关的文章: <移动Web怎么做屏幕适配(一)>重点介绍了怎样利 ...

  8. [持久更新] 剑指offer题目Python做题记录

    第一题 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:先快速定位到 ...

  9. Java面试题精选(三) JSP/Servlet Java面试逻辑题

    --   JSP/Servlet  Java面试逻辑题   --     很显然,Servlet/JSP的WEB前端动态制作的重要性比HTML/CSS/JS的价值高很多,但我们都知道他们都是建立在HT ...

随机推荐

  1. 请解释或描述一下Django的架构

    对于Django框架遵循MVC设计,并且有一个专有名词:MVT M全拼为Model,与MVC中的M功能相同,负责数据处理,内嵌了ORM框架 V全拼为View,与MVC中的C功能相同,接收HttpReq ...

  2. C# 百度API地址坐标互相转换

    通过C#代码将地址字符串转为经纬度坐标,或者将经纬度转为具体的地址字符串,在不通外网的项目中是有需求的. 具体步骤: 一.创建BaiduMapHelper,用于定义地址信息和请求. public st ...

  3. [C++] wchar_t关键字使用方法

    char 是单字符类型,长度为一个字节 wchar_t 是宽字符类型,长度为两个字节,主要用在国际 Unicode 编码中 举例: #include<iostream> using nam ...

  4. VC++ 返回13位时间戳(Unix时间戳)

    //获取13位时间戳 CString GetUnixTime() { CString nowTime; SYSTEMTIME sysTime; GetLocalTime(&sysTime); ...

  5. Spring 源码学习之环境搭建

    一.下载Spring 源码 进入 https://github.com/spring-projects/spring-framework/tags 选择下载spring freamework的版本 h ...

  6. Flutter -------- 解析JSON数据

    SON序列化方法: 手动序列化和反序列化通过代码生成自动序列化和反序列化 手动JSON序列化是指使使用dart:convert中内置的JSON解码器.它将原始JSON字符串传递给JSON.decode ...

  7. viewSwitcher 切换视图

    通过VIewSwitcher切换视图.这个用到了baseAdapter,还是不太懂,先记个笔记. <RelativeLayout xmlns:android="http://schem ...

  8. openresty开发系列28--openresty中操作mysql

    openresty开发系列28--openresty中操作mysql Mysql客户端   应用中最常使用的就是数据库了,尤其mysql数据库,那openresty lua如何操作mysql呢?   ...

  9. pycharm怎么修改python路径

    今天安装Django的时候遇到了python版本冲突,找不到python路径,所以又重新安装了一个python3.6.5 安装完之后,突然发现自己的pycharm是之前Anaconda的3.5版本,那 ...

  10. matplotlib 常用操作

    标准的Python中用列表(list)保存一组值,可以当作数组使用.但由于列表的元素可以是任何对象,因此列表中保存的是对象的指针.这样一来,为了保存一个简单的列表[1,2,3],就需 要有三个指针和三 ...