From d219cb38192c414ec635ab4800464422eaec3d49 Mon Sep 17 00:00:00 2001 From: lehatheslayer Date: Wed, 29 Nov 2023 22:21:16 +0300 Subject: [PATCH] homework system --- src/Homework.java | 18 ++++++++++++++++++ src/HomeworkChecker.java | 36 ++++++++++++++++++++++++++++++++++++ src/HomeworkSystem.java | 40 ++++++++++++++++++++++++++++++++++++++++ src/Main.java | 18 ++++++++++++++++++ src/Student.java | 6 ++++++ 5 files changed, 118 insertions(+) create mode 100644 src/Homework.java create mode 100644 src/HomeworkChecker.java create mode 100644 src/HomeworkSystem.java create mode 100644 src/Main.java create mode 100644 src/Student.java diff --git a/src/Homework.java b/src/Homework.java new file mode 100644 index 0000000..dd21f8b --- /dev/null +++ b/src/Homework.java @@ -0,0 +1,18 @@ +import java.time.LocalDateTime; + +public record Homework( + String content, + String authorName, + LocalDateTime sendDateTime +) implements Comparable { + @Override + public int compareTo(Homework o) { + if (this.sendDateTime.isAfter(o.sendDateTime)) { + return 1; + } else if (this.sendDateTime.isBefore(o.sendDateTime)) { + return -1; + } + + return 0; + } +} diff --git a/src/HomeworkChecker.java b/src/HomeworkChecker.java new file mode 100644 index 0000000..5e0583d --- /dev/null +++ b/src/HomeworkChecker.java @@ -0,0 +1,36 @@ +import java.time.LocalDateTime; +import java.util.Random; + +public class HomeworkChecker implements Runnable { + private final HomeworkSystem system; + private final Random random; + + public HomeworkChecker(HomeworkSystem system) { + this.system = system; + this.random = new Random(); + } + + @Override + public void run() { + while (true) { + try { + Homework homework = system.getNextHomework(); + LocalDateTime deadline = system.getDeadline().get(); + + int grade = getGradeForHomework(homework, deadline); + System.out.printf("%s checker result for homework of student %s: %s%n", + this, homework.authorName(), grade); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + + public int getGradeForHomework(Homework homework, LocalDateTime deadline) { + if (homework.sendDateTime().isAfter(deadline)) { + return 0; + } + + return random.nextInt(6); + } +} diff --git a/src/HomeworkSystem.java b/src/HomeworkSystem.java new file mode 100644 index 0000000..198a46d --- /dev/null +++ b/src/HomeworkSystem.java @@ -0,0 +1,40 @@ +import java.time.LocalDateTime; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.PriorityBlockingQueue; +import java.util.concurrent.Semaphore; +import java.util.concurrent.atomic.AtomicReference; + +public class HomeworkSystem { + private final Semaphore semaphore; + private final BlockingQueue queue; + private final AtomicReference deadline; + + public HomeworkSystem(int maxConcurrentCheckers) { + this.semaphore = new Semaphore(maxConcurrentCheckers); + this.queue = new PriorityBlockingQueue<>(); + this.deadline = new AtomicReference<>(); + } + + public void setDeadlineForCurrentHomework(LocalDateTime deadline) { + this.deadline.set(deadline); + } + + public AtomicReference getDeadline() { + return deadline; + } + + public void receiveHomework(Homework homework) { + queue.add(homework); + } + + public Homework getNextHomework() throws InterruptedException { + semaphore.acquire(); + try { + Homework homework = queue.take(); + // Проверка дедлайна + return homework; + } finally { + semaphore.release(); + } + } +} diff --git a/src/Main.java b/src/Main.java new file mode 100644 index 0000000..9d18e26 --- /dev/null +++ b/src/Main.java @@ -0,0 +1,18 @@ +import java.time.LocalDateTime; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class Main { + public static void main(String[] args) { + HomeworkSystem system = new HomeworkSystem(5); + system.setDeadlineForCurrentHomework(LocalDateTime.now().plusDays(7)); + ExecutorService executor = Executors.newFixedThreadPool(10); + + for (int i = 0; i < 10; i++) { + executor.execute(new HomeworkChecker(system)); + } + + Student student1 = new Student("Alex"); + student1.submitHomework(system, new Homework("Math Homework", student1.name(), LocalDateTime.now())); + } +} \ No newline at end of file diff --git a/src/Student.java b/src/Student.java new file mode 100644 index 0000000..51ff15d --- /dev/null +++ b/src/Student.java @@ -0,0 +1,6 @@ +public record Student(String name) { + + public void submitHomework(HomeworkSystem system, Homework homework) { + system.receiveHomework(homework); + } +}