该场景来自于: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 stub
int 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();// 纳秒级别
} @Override
public int compareTo(Delayed o) {
// TODO Auto-generated method stub
if (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;
}
} @Override
public long getDelay(TimeUnit unit) {
// TODO Auto-generated method stub
return unit.convert(submitTime - System.nanoTime(), TimeUnit.NANOSECONDS);
} @Override
public void run() {
// TODO Auto-generated method stub
if (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;
} @Override
public void run() {
// TODO Auto-generated method stub
try {
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 exception
e.printStackTrace();
}
} }

  

最新文章

  1. Bash 会清空从父进程继承来的 OLDPWD
  2. 你应该知道的25道Javascript面试题
  3. 使用migrate.exe执行EF code first 迁移
  4. DIV当textarea使用,在聚焦的时候将光标移动到内容的末尾
  5. 关于SWT中的表格(TableViewer类)
  6. 教程-(SQL DBE、ADO连接)+(Firebird火鸟+DbExpress)+(VF DBF数据库)+(DB Paradox)
  7. (转载)c库不正确问题
  8. apt-mirror
  9. SDAU课程练习--problemQ(1016)
  10. [ Java学习基础 ] Java的对象容器 -- 集合
  11. springboot2.1.3集成单节点elasticsearch6.4.0
  12. 初探Java设计模式3:行为型模式(策略,观察者等)
  13. bootstrap-treeview 树形菜单带复选框以及级联选择
  14. ZooKeeper系列(2):ZooKeeper命令行工具zkCli.sh
  15. Maven项目构建过程练习
  16. elasticsearch golang的sdk使用
  17. web端跨域调用webapi(转)
  18. Linux(Ubuntu)配置问题集
  19. 【SSH网上商城项目实战10】商品类基本模块的搭建
  20. IntelliJ 、Pycharm、webstorm 2017 注册码及注册服务器

热门文章

  1. 转(C# 类似右键菜单弹出窗体)
  2. 【vue】项目编译报错‘npm ERR! **@**dev: `webpack-dev-server --inline --progress --config ’’
  3. ovs QOS
  4. leetcode 152. 乘积最大子序列 java
  5. 设计模式《JAVA与模式》之状态模式
  6. 跟踪spring MVC的请求
  7. Hive在drop表的时候报错
  8. POJ 2578
  9. socket http tcp udp ip 协议
  10. 剑指offer七之斐波那契数列