考試 120 分鐘,30 分鐘後可交卷。初始化考生完成時間最小 30 分鐘。需實現:
Student 實現 Runnable、Delayed,含姓名、預計用時、提交時間、是否強制標記。Teacher 線程輪詢 DelayQueue<Student>,收取到期考生試卷;時間到遍歷剩餘隊列強制交卷。public class DelayQueueDemoOne {
public static void main(String[] args) throws InterruptedException {
int studentNumber = 20;
DelayQueue students = new DelayQueue<>();
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));
new Thread(new Teacher(students)).start();
}
}
class Student implements Runnable, Delayed {
private String name;
public long workTime;
private long submitTime;
private boolean isForce = false;
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) { /* 按 workTime 排序 */ }
@Override public long getDelay(TimeUnit unit) { /* 返回剩餘納秒 */ }
@Override public void run() { /* 打印交卷信息 */ }
// getter/setter 省略
}
class Teacher implements Runnable {
private int counter = 20;
private DelayQueue students;
public Teacher(DelayQueue students) { this.students = students; }
@Override public void run() {
System.out.println("test start");
while (counter > 0) {
Student student = students.poll();
if (student != null && student.workTime < 120) {
student.run();
counter--;
} else {
System.out.println("考試時間到,全部交卷!");
for (Student s : students) {
s.setForce(true);
s.run();
counter--;
}
}
}
}
}