Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions src/main/java/org/example/Main.java
Original file line number Diff line number Diff line change
@@ -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<Homework> 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();
}
}
35 changes: 35 additions & 0 deletions src/main/java/org/example/Utils.java
Original file line number Diff line number Diff line change
@@ -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<Homework> generateAndSubmitHomework(int numberOfHomeworks, long minDeadline, long maxDeadline) {
List<Homework> 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;
}
}
39 changes: 39 additions & 0 deletions src/main/java/org/example/model/Homework.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package org.example.model;

public class Homework implements Comparable<Homework> {
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);
}
}
22 changes: 22 additions & 0 deletions src/main/java/org/example/model/Student.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.example.model;

import java.util.concurrent.CopyOnWriteArrayList;

public class Student {
private final String name;
private final CopyOnWriteArrayList<Homework> 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);
}
}
30 changes: 30 additions & 0 deletions src/main/java/org/example/service/Grader.java
Original file line number Diff line number Diff line change
@@ -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();
}
}
}
45 changes: 45 additions & 0 deletions src/main/java/org/example/service/HomeworkSystem.java
Original file line number Diff line number Diff line change
@@ -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<Homework> 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);
}
}