diff --git a/src/Checker.java b/src/Checker.java new file mode 100644 index 0000000..ea1dd84 --- /dev/null +++ b/src/Checker.java @@ -0,0 +1,33 @@ +import java.util.concurrent.Semaphore; + +public class Checker extends Thread { + private final Homework homework; + private final Semaphore semaphore; + + public Checker(Homework homework, Semaphore semaphore) { + this.homework = homework; + this.semaphore = semaphore; + } + + @Override + public void run() { + try { + semaphore.acquire(); + System.out.println("Checking homework '" + homework.getName() + "' from ID: " + homework.getId()); + + long currentTime = System.currentTimeMillis(); + if (currentTime > homework.getDeadline()) { + System.out.println("Homework '" + homework.getName() + "' ID " + homework.getId() + " not completed by deadline. Grade: 2"); + } else { + Thread.sleep(1000); + + int grade = (int) (Math.random() * 4 + 2); + System.out.println("Homework grade '" + homework.getName() + "' to ID " + homework.getId() + ": " + grade); + } + + semaphore.release(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} diff --git a/src/Homework.java b/src/Homework.java new file mode 100644 index 0000000..dd44768 --- /dev/null +++ b/src/Homework.java @@ -0,0 +1,28 @@ +public class Homework implements Comparable { + private final int id; + private final String name; + private final long deadline; + + public Homework(int id, String name, long deadline) { + this.id = id; + this.name = name; + this.deadline = deadline; + } + + public int getId() { + return id; + } + + public String getName() { + return name; + } + + public long getDeadline() { + return deadline; + } + + @Override + public int compareTo(Homework other) { + return Long.compare(this.deadline, other.deadline); + } +} diff --git a/src/HomeworkCheckingSystem.java b/src/HomeworkCheckingSystem.java new file mode 100644 index 0000000..3d3f50f --- /dev/null +++ b/src/HomeworkCheckingSystem.java @@ -0,0 +1,28 @@ +import java.util.concurrent.PriorityBlockingQueue; +import java.util.concurrent.Semaphore; + +public class HomeworkCheckingSystem { + private final Semaphore semaphore; + private final PriorityBlockingQueue homeworkQueue = new PriorityBlockingQueue<>(); + + public HomeworkCheckingSystem(int permits) { + this.semaphore = new Semaphore(permits); + } + + public void receiveHomework(Homework homework) { + homeworkQueue.add(homework); + processHomework(); + } + + private void processHomework() { + while (!homeworkQueue.isEmpty()) { + try { + Homework homework = homeworkQueue.take(); + Checker checker = new Checker(homework, semaphore); + checker.start(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/Main.java b/src/Main.java new file mode 100644 index 0000000..ecdc54d --- /dev/null +++ b/src/Main.java @@ -0,0 +1,23 @@ +public class Main { + public static void main(String[] args) { + HomeworkCheckingSystem system = new HomeworkCheckingSystem(3); + + String[] homeworkNames = {"Математика", "Физика", "Литература", "История", "Биология"}; + + while (true) { + int studentId = (int) (Math.random() * 100); + int homeworkId = (int) (Math.random() * 100); + String homeworkName = homeworkNames[(int) (Math.random() * homeworkNames.length)]; + long deadline = System.currentTimeMillis() + (long) (Math.random() * 10); + + Student student = new Student(studentId); + student.submitHomework(system, new Homework(homeworkId, homeworkName, deadline)); + + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/Student.java b/src/Student.java new file mode 100644 index 0000000..6fdcfab --- /dev/null +++ b/src/Student.java @@ -0,0 +1,11 @@ +public class Student { + private final int id; + + public Student(int id) { + this.id = id; + } + + public void submitHomework(HomeworkCheckingSystem system, Homework homework) { + system.receiveHomework(homework); + } +}