diff --git a/src/HomeWork.java b/src/HomeWork.java new file mode 100644 index 0000000..02ed4fe --- /dev/null +++ b/src/HomeWork.java @@ -0,0 +1,4 @@ +import java.time.LocalDate; + +public record HomeWork(String data, Integer id, LocalDate deadLine) { +} diff --git a/src/HomeWorkCheckSystem.java b/src/HomeWorkCheckSystem.java new file mode 100644 index 0000000..69e7a8f --- /dev/null +++ b/src/HomeWorkCheckSystem.java @@ -0,0 +1,56 @@ +import java.util.concurrent.*; +import java.util.function.Consumer; + +public class HomeWorkCheckSystem extends Thread { + + private final ExecutorService executorService = Executors.newFixedThreadPool(5); + private final PriorityBlockingQueue hwQueue = new PriorityBlockingQueue<>(10, new HomeWorkComparator()); + private final ConcurrentHashMap> hwCheckCallbacks = new ConcurrentHashMap<>(); + private final ConcurrentHashMap results = new ConcurrentHashMap<>(); + + @Override + public void run() { + super.run(); + try { + while (true) { + HomeWork needToCheck = hwQueue.poll(); + if (needToCheck == null) { + System.out.println("Waiting for new homeworks"); + sleep(1000); + continue; + } + System.out.println("Pushing hw " + needToCheck.id() + " with deadline: " + needToCheck.deadLine() + " to check" ); + processHomeWorkCheck(needToCheck); + } + } catch (InterruptedException | ExecutionException e) { + throw new RuntimeException(e); + } + } + + public void sendHomeWorkForCheck(HomeWork hw, Consumer callback) { + System.out.println("New homework: " + hw.id() + " with deadline: " + hw.deadLine()); + hwQueue.add(hw); + hwCheckCallbacks.put(hw.id(), callback); + } + + public HomeWorkResult getHomeWorkResult(Integer id) { + return results.get(id); + } + + private void processHomeWorkCheck(HomeWork hw) throws InterruptedException, ExecutionException { + var future = executorService.submit(() -> { + try { + System.out.println("Processing hw check: " + hw.id()); + sleep(1000); + double randNumber = Math.random(); + double score = randNumber * 100; + HomeWorkResult hwResult = new HomeWorkResult(hw, score, "Some description..."); + results.put(hw.id(), hwResult); + hwCheckCallbacks.get(hw.id()).accept(hwResult); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + }); + } + +} diff --git a/src/HomeWorkComparator.java b/src/HomeWorkComparator.java new file mode 100644 index 0000000..62986f5 --- /dev/null +++ b/src/HomeWorkComparator.java @@ -0,0 +1,10 @@ +import java.util.Comparator; + +public class HomeWorkComparator implements Comparator { + + @Override + public int compare(HomeWork o1, HomeWork o2) { + return o1.deadLine().compareTo(o2.deadLine()); + } + +} diff --git a/src/HomeWorkResult.java b/src/HomeWorkResult.java new file mode 100644 index 0000000..a120a05 --- /dev/null +++ b/src/HomeWorkResult.java @@ -0,0 +1,3 @@ +public record HomeWorkResult(HomeWork hw, Double score, String description) { + +} diff --git a/src/Main.java b/src/Main.java new file mode 100644 index 0000000..a2de6ea --- /dev/null +++ b/src/Main.java @@ -0,0 +1,10 @@ +public class Main { + public static void main(String[] args) { + HomeWorkCheckSystem system = new HomeWorkCheckSystem(); + system.start(); + for (var i = 0; i < 15; i++) { + Student st = new Student(system, i); + st.start(); + } + } +} \ No newline at end of file diff --git a/src/Student.java b/src/Student.java new file mode 100644 index 0000000..3031298 --- /dev/null +++ b/src/Student.java @@ -0,0 +1,58 @@ +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; +import java.util.Date; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; +import java.util.function.Consumer; + +public class Student extends Thread { + + private final Integer id; + + private final HomeWorkCheckSystem checkSystem; + + public Student(HomeWorkCheckSystem checkSystem, Integer id) { + this.checkSystem = checkSystem; + this.id = id; + } + + @Override + public void run() { + super.run(); + try { + while (true) { + sleep(2000); + if (Math.random() < 0.25) { + sleep(3000); + continue; + } + HomeWork hw = processHomeWork(); + System.out.println("Student " + id + " sending homework: " + hw.id() + " with deadline: " + hw.deadLine()); + Consumer callback = homeWorkResult -> System.out.println("Homework " + hw.id() + " result, with score: " + homeWorkResult.score()); + checkSystem.sendHomeWorkForCheck(hw, callback); + } + } catch ( + InterruptedException e) { + throw new RuntimeException(e); + } + } + + private HomeWorkResult getResult(HomeWork hw) { + HomeWorkResult hwResult = checkSystem.getHomeWorkResult(hw.id()); + System.out.println("Received result of homework " + hw.id() + " with score: " + hwResult.score()); + return hwResult; + } + + private HomeWork processHomeWork() { + Random ran = new Random(); + int homeworkId = ran.nextInt(); + + LocalDate startDate = LocalDate.of(2023, 12, 1); + LocalDate endDate = LocalDate.of(2024, 5, 31); + long daysBetween = ChronoUnit.DAYS.between(startDate, endDate); + long randomNumberOfDays = ThreadLocalRandom.current().nextLong(daysBetween + 1); + LocalDate deadline = startDate.plusDays(randomNumberOfDays); + + return new HomeWork("SomeData", homeworkId, deadline); + } +}