首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 並發編程:DelayQueue 應用場景——多考生考試模擬

     編輯:Java 相關知識

場景描述

考試 120 分鐘,30 分鐘後可交卷。初始化考生完成時間最小 30 分鐘。需實現:

  1. 120 分鐘內自主交卷的考生正常處理。
  2. 120 分鐘到達,未交卷考生強制交卷。
  3. 所有考生交卷後關閉控制線程。

設計

  • 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--;
                }
            }
        }
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved