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
18 changes: 18 additions & 0 deletions src/Homework.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import java.time.LocalDateTime;

public record Homework(
String content,
String authorName,
LocalDateTime sendDateTime
) implements Comparable<Homework> {
@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;
}
}
36 changes: 36 additions & 0 deletions src/HomeworkChecker.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
40 changes: 40 additions & 0 deletions src/HomeworkSystem.java
Original file line number Diff line number Diff line change
@@ -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<Homework> queue;
private final AtomicReference<LocalDateTime> 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<LocalDateTime> 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();
}
}
}
18 changes: 18 additions & 0 deletions src/Main.java
Original file line number Diff line number Diff line change
@@ -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()));
}
}
6 changes: 6 additions & 0 deletions src/Student.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
public record Student(String name) {

public void submitHomework(HomeworkSystem system, Homework homework) {
system.receiveHomework(homework);
}
}