From 1b5a05b2094cdcf7341ca5d8d577b5bfae11af5d Mon Sep 17 00:00:00 2001 From: Andrey Svistukhin Date: Wed, 29 Nov 2023 14:31:33 +0300 Subject: [PATCH] hw --- src/main/java/org/example/Main.java | 32 +++++++++++++ src/main/java/org/example/Utils.java | 35 +++++++++++++++ src/main/java/org/example/model/Homework.java | 39 ++++++++++++++++ src/main/java/org/example/model/Student.java | 22 +++++++++ src/main/java/org/example/service/Grader.java | 30 +++++++++++++ .../org/example/service/HomeworkSystem.java | 45 +++++++++++++++++++ 6 files changed, 203 insertions(+) create mode 100644 src/main/java/org/example/Main.java create mode 100644 src/main/java/org/example/Utils.java create mode 100644 src/main/java/org/example/model/Homework.java create mode 100644 src/main/java/org/example/model/Student.java create mode 100644 src/main/java/org/example/service/Grader.java create mode 100644 src/main/java/org/example/service/HomeworkSystem.java diff --git a/src/main/java/org/example/Main.java b/src/main/java/org/example/Main.java new file mode 100644 index 0000000..9751280 --- /dev/null +++ b/src/main/java/org/example/Main.java @@ -0,0 +1,32 @@ +package org.example; + +import org.example.model.Homework; +import org.example.service.HomeworkSystem; + +import java.util.List; + +public class Main { + + public static void main(String[] args) throws InterruptedException { + HomeworkSystem homeworkSystem = new HomeworkSystem(); + + new Thread(homeworkSystem::startGrading).start(); + + List homeworkList = Utils.generateAndSubmitHomework( + 100, + System.currentTimeMillis(), + System.currentTimeMillis() + 1000000 + ); + + homeworkList.forEach(homework -> { + try { + homeworkSystem.submitHomework(homework); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + }); + + Thread.sleep(500000); // можно ещё сделать либо while(working), но зачем)) + homeworkSystem.shutdown(); + } +} diff --git a/src/main/java/org/example/Utils.java b/src/main/java/org/example/Utils.java new file mode 100644 index 0000000..cf3c9a4 --- /dev/null +++ b/src/main/java/org/example/Utils.java @@ -0,0 +1,35 @@ +package org.example; + +import org.example.model.Homework; +import org.example.model.Student; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class Utils { + + private static final Random random = new Random(); + + private Utils() { + // utils class + } + + public static List generateAndSubmitHomework(int numberOfHomeworks, long minDeadline, long maxDeadline) { + List homeworkList = new ArrayList<>(); + for (int i = 0; i < numberOfHomeworks; i++) { + String studentName = "Student " + (i + 1); + String content = "Homework " + (i + 1); + long deadline = System.currentTimeMillis() + random.nextLong(maxDeadline - minDeadline) + minDeadline; + + homeworkList.add( + new Homework( + new Student(studentName), + content, + deadline + ) + ); + } + return homeworkList; + } +} diff --git a/src/main/java/org/example/model/Homework.java b/src/main/java/org/example/model/Homework.java new file mode 100644 index 0000000..427f381 --- /dev/null +++ b/src/main/java/org/example/model/Homework.java @@ -0,0 +1,39 @@ +package org.example.model; + +public class Homework implements Comparable { + private final Student student; + private final String content; + private final long deadline; + private String result; + + public Homework(Student student, String content, long deadline) { + this.student = student; + this.content = content; + this.deadline = deadline; + } + + public void setResult(String result) { + this.result = result; + } + + public Student getStudent() { + return student; + } + + public String getContent() { + return content; + } + + public long getDeadline() { + return deadline; + } + + public String getResult() { + return result; + } + + @Override + public int compareTo(Homework o) { + return Long.compare(this.deadline, o.deadline); + } +} diff --git a/src/main/java/org/example/model/Student.java b/src/main/java/org/example/model/Student.java new file mode 100644 index 0000000..90ea03b --- /dev/null +++ b/src/main/java/org/example/model/Student.java @@ -0,0 +1,22 @@ +package org.example.model; + +import java.util.concurrent.CopyOnWriteArrayList; + +public class Student { + private final String name; + private final CopyOnWriteArrayList homeworks; + + public Student(String name) { + this.name = name; + this.homeworks = new CopyOnWriteArrayList<>(); + } + + public String getName() { + return name; + } + + public void sendResult(Homework homework) { + homeworks.removeIf(hw -> hw.getContent().equals(homework.getContent())); + homeworks.add(homework); + } +} diff --git a/src/main/java/org/example/service/Grader.java b/src/main/java/org/example/service/Grader.java new file mode 100644 index 0000000..c9d863b --- /dev/null +++ b/src/main/java/org/example/service/Grader.java @@ -0,0 +1,30 @@ +package org.example.service; + +import org.example.model.Homework; + +import java.util.Random; + +class Grader implements Runnable { + private final Homework homework; + private final HomeworkSystem system; + private final Random random = new Random(); + + + public Grader(Homework homework, HomeworkSystem system) { + this.homework = homework; + this.system = system; + } + + @Override + public void run() { + try { + Thread.sleep(random.nextInt(5000)); + + int grade = random.nextInt(5) + 1; + homework.setResult("Grade: " + grade); + system.postResult(homework); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } +} diff --git a/src/main/java/org/example/service/HomeworkSystem.java b/src/main/java/org/example/service/HomeworkSystem.java new file mode 100644 index 0000000..de8201d --- /dev/null +++ b/src/main/java/org/example/service/HomeworkSystem.java @@ -0,0 +1,45 @@ +package org.example.service; + +import org.example.model.Homework; + +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.PriorityBlockingQueue; +import java.util.concurrent.TimeUnit; + +public class HomeworkSystem { + private final BlockingQueue homeworkQueue = new PriorityBlockingQueue<>(); + private final ExecutorService executor = Executors.newFixedThreadPool(10); + + public void submitHomework(Homework homework) throws InterruptedException { + homeworkQueue.put(homework); + } + + public void startGrading() { + while (!Thread.currentThread().isInterrupted()) { + try { + Homework homework = homeworkQueue.take(); + long currentTime = System.currentTimeMillis(); + if (currentTime < homework.getDeadline()) { + executor.execute(new Grader(homework, this)); + } else { + homework.setResult("Deadline has expired"); + postResult(homework); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + } + + public void postResult(Homework homework) { + System.out.println("Student: " + homework.getStudent().getName() + ", result: " + homework.getResult() + ", deadline: " + homework.getDeadline()); + homework.getStudent().sendResult(homework); // O_o + } + + public void shutdown() throws InterruptedException { + executor.shutdown(); + executor.awaitTermination(5, TimeUnit.MINUTES); + } +}