该场景来自于:http://www.cnblogs.com/sunzhenchao/p/3515085.html。

模拟一个考试的日子,考试时间为120分钟,30分钟后才可交卷,当时间到了,或学生都交完卷了考试结束。

这个场景中几个点需要注意:

  1. 考试时间为120分钟,30分钟后才可交卷,初始化考生完成试卷时间最小应为30分钟
  2. 对于能够在120分钟内交卷的考生,如何实现这些考生交卷
  3. 对于120分钟内没有完成考试的考生,在120分钟考试时间到后需要让他们强制交卷
  4. 在所有的考生都交完卷后,需要将控制线程关闭

抽象出两个类,学生类和老师类,用DelayQueue存储考生(Student类)。每一个考生都有自己的名字和完成试卷的时间

Teacher线程对DelayQueue进行监控,收取完成试卷小于120分钟的学生的试卷。当考试时间120分钟到时,teacher线程宣布考试结束,强制DelayQueue中还存在的考生交卷。

package zhongqiu.common.base.thread;import java.util.Iterator;
import java.util.Random;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;public class DelayQueueDemoOne {public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stubint studentNumber = 20;DelayQueue<Student> students = new DelayQueue<Student>();Random random = new Random();for (int i = 0; i < studentNumber; i++) {students.put(new Student("student" + (i + 1), 30 + random.nextInt(120)));}students.put(new Student("student",120));Thread teacherThread = new Thread(new Teacher(students));teacherThread.start();}
}class Student implements Runnable, Delayed {private String name;public long workTime;private long submitTime;private boolean isForce = false;public Student() {}public Student(String name, long workTime) {this.name = name;this.workTime = workTime;this.submitTime = TimeUnit.NANOSECONDS.convert(workTime, TimeUnit.NANOSECONDS) + System.nanoTime();// 纳秒级别}@Overridepublic int compareTo(Delayed o) {// TODO Auto-generated method stubif (o == null || !(o instanceof Student))return 1;if (o == this)return 0;Student s = (Student) o;if (this.workTime > s.workTime) {return 1;} else if (this.workTime == s.workTime) {return 0;} else {return -1;}}@Overridepublic long getDelay(TimeUnit unit) {// TODO Auto-generated method stubreturn unit.convert(submitTime - System.nanoTime(), TimeUnit.NANOSECONDS);}@Overridepublic void run() {// TODO Auto-generated method stubif (isForce) {System.out.println(name + " 交卷,实际用时 120分钟");} else {System.out.println(name + " 交卷," + "实际用时 " + workTime + " 分钟");}}public boolean isForce() {return isForce;}public void setForce(boolean isForce) {this.isForce = isForce;}}class Teacher implements Runnable {private int counter = 20;private DelayQueue<Student> students;public Teacher(DelayQueue<Student> students) {this.students = students;}@Overridepublic void run() {// TODO Auto-generated method stubtry {System.out.println(" test start");while (counter > 0) {Student student = students.poll();if (student.workTime<120) {student.run();if (counter > 0) {counter--;}} else {System.out.println(" 考试时间到,全部交卷!");Student tmpStudent;for (Iterator<Student> iterator2 = students.iterator(); iterator2.hasNext();) {tmpStudent = iterator2.next();tmpStudent.setForce(true);tmpStudent.run();if (counter > 0) {counter--;}}}}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}}

  

转载于:https://www.cnblogs.com/wangzhongqiu/p/6461880.html

【Java并发编程】3、DelayQueue应用场景,多考生考试相关推荐

  1. 【Java 并发编程】CountDownLatch 使用场景示例

    文章目录 I CountDownLatch 使用场景举例 II CountDownLatch 简单线程阻塞示例 III CountDownLatch 多个线程联合阻塞示例 I CountDownLat ...

  2. Java并发编程71道面试题及答案

    Java并发编程71道面试题及答案 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方 ...

  3. Java并发编程75道面试题及答案

    1.在java中守护线程和本地线程区别?java中的线程分为两种:守护线程(Daemon)和用户线程(User).任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bo ...

  4. Java 并发编程-不懂原理多吃亏(送书福利)

    作者 | 加多 关注阿里巴巴云原生公众号,后台回复关键字"并发",即可参与送书抽奖! ** 导读:并发编程与 Java 中其他知识点相比较而言学习门槛较高,从而导致很多人望而却步. ...

  5. java 并发编程总结

    这边文章的主要内容是基于"java并发编程艺术"这本书,中间加入了一些自己的理解.这篇文章包括并发编程涉及到的几乎所有基础知识.主要是帮助长期从事业务逻辑开发的java程序员梳理一 ...

  6. Java并发编程面试题(2020最新版)

    转载自  Java并发编程面试题(2020最新版) 基础知识 并发编程的优缺点 为什么要使用并发编程(并发编程的优点) 充分利用多核CPU的计算能力:通过并发编程的形式可以将多核CPU的计算能力发挥到 ...

  7. Java并发编程 基础知识学习总结

    Java并发编程一直是Java程序员必须懂但又是很难懂的技术内容,这部分的内容我也是反复学习了好几遍才能理解.本篇博客梳理一下最近从<Java 并发编程的艺术>和他人的博客学习Java并发 ...

  8. 《Java并发编程的艺术》笔记

    <Java并发编程的艺术>笔记 第1章 并发编程的挑战 1.1 上下文切换 CPU通过时间片分配算法来循环执行任务,任务从保存到再加载的过程就是一次上下文切换. 减少上下文切换的方法有4种 ...

  9. Java并发编程73道面试题及答案 —— 面试稳了 侵立删

    作者:乌枭 来自:https://blog.csdn.net/qq_34039315/article/details/78549311 最近后台和微信理有很多读者让我整理一些面试题,我就把这事放在心上 ...

  10. Java并发编程的艺术(推荐指数:☆☆☆☆☆☆)

    文章目录 Java并发编程的艺术(推荐指数:☆☆☆☆☆☆) 并发编程的挑战 Java并发机制的底层实现原理 Volatile的应用 实现原理 synchronized的实现原理与应用 对象头 锁详解 ...

最新文章

  1. 输入过欠压保护电路原理图
  2. (九)2005年我的第一次软件行业创业,烧掉30万、2年时间打水漂的惨痛教训
  3. insert into语句_入门MySQL——DML语句篇
  4. spring mvc在Controller中获取ApplicationContext
  5. 07MySQL综合应用
  6. 2个维度5大方法,让你的微服务在K8s上跑起来
  7. 理解vue中if和for指令不能同时使用
  8. Flink 在 B 站的多元化探索与实践
  9. 易宝支付 -- 微信小程序对接
  10. [网络安全自学篇] 三十五.恶意代码攻击溯源及恶意样本分析
  11. 2110449-02-8,2110449-02-8巯基反应性PEG
  12. 回车、换行、空格的ASCII码值(不同OS平台下文件换行定义)
  13. Java中的数组利用键盘输入求平均数
  14. 让你眼前一亮的3. Tomcat 性能调优 (值得收藏)
  15. php配置Apache(Windows)
  16. 南京邮电大学操作系统实验五:Windows平台多进程共享内存通信
  17. barrier linux,Linux Barrier I/O
  18. 郑州三级分销系统小程序开发层级划分
  19. Vista Beta下载
  20. 漫看影视:豆瓣2019年评分最高外语电影推荐

热门文章

  1. 计算机技术运用家具,计算机技术在家具企业中的应用与控制管理
  2. wpf 切换搜狗输入法英文_搜狗输入法使用技巧整理,建议保存收藏
  3. 同济大学计算机保研名单,同济大学2021届保研率27.8%,主要保研本校、复交清国...
  4. java.util.stream.LongStream
  5. 2.4配置自定义拦截器
  6. 【渝粤教育】国家开放大学2018年春季 0701-22T公共政策学 参考试题
  7. 【渝粤教育】国家开放大学2018年春季 0089-21DInternet和Intranet应用 参考试题
  8. 【实物】端到端自动驾驶搭建教程(一)附完整资料
  9. 计算机视觉实战(三)阈值与平滑处理
  10. Replica set 的选举策略之一 (转)