From 202064b8d2c74181b755aa3455735f88c4b0f651 Mon Sep 17 00:00:00 2001 From: aurhwwh Date: Fri, 20 Mar 2026 20:17:37 +0300 Subject: [PATCH 1/2] first try --- .../tasks/synchronizer/StreamWriter.java | 23 +++++++++++++++---- .../tasks/synchronizer/StreamingMonitor.java | 10 +++++++- .../tasks/synchronizer/Synchronizer.java | 15 +++++++++++- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/main/java/hse/java/lectures/lecture6/tasks/synchronizer/StreamWriter.java b/src/main/java/hse/java/lectures/lecture6/tasks/synchronizer/StreamWriter.java index fedb5e66..04c677ff 100644 --- a/src/main/java/hse/java/lectures/lecture6/tasks/synchronizer/StreamWriter.java +++ b/src/main/java/hse/java/lectures/lecture6/tasks/synchronizer/StreamWriter.java @@ -26,10 +26,25 @@ public void attachMonitor(StreamingMonitor monitor) { @Override public void run() { - // Writer threads are intentionally infinite for the task contract. - while (true) { - output.print(message); - onTick.run(); + synchronized (monitor) { + // Writer threads are intentionally infinite for the task contract. + while (true) { + if (monitor.current>=monitor.total){ + monitor.notifyAll(); + return; + } + if ((monitor.current % monitor.N) + 1 == id) { + output.print(message); + onTick.run(); + monitor.current++; + monitor.notifyAll(); + } + try { + monitor.wait(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } } } diff --git a/src/main/java/hse/java/lectures/lecture6/tasks/synchronizer/StreamingMonitor.java b/src/main/java/hse/java/lectures/lecture6/tasks/synchronizer/StreamingMonitor.java index 68e8f279..ed660d8c 100644 --- a/src/main/java/hse/java/lectures/lecture6/tasks/synchronizer/StreamingMonitor.java +++ b/src/main/java/hse/java/lectures/lecture6/tasks/synchronizer/StreamingMonitor.java @@ -1,5 +1,13 @@ package hse.java.lectures.lecture6.tasks.synchronizer; public class StreamingMonitor { - // impl your sync here + int N, ticksPerWriter; + int current = 0; + int total; + StreamingMonitor(int N,int ticksPerWriter){ + this.N=N; + this.ticksPerWriter=ticksPerWriter; + total=N*ticksPerWriter; + } + } diff --git a/src/main/java/hse/java/lectures/lecture6/tasks/synchronizer/Synchronizer.java b/src/main/java/hse/java/lectures/lecture6/tasks/synchronizer/Synchronizer.java index 3cb8aded..39f037ff 100644 --- a/src/main/java/hse/java/lectures/lecture6/tasks/synchronizer/Synchronizer.java +++ b/src/main/java/hse/java/lectures/lecture6/tasks/synchronizer/Synchronizer.java @@ -22,12 +22,25 @@ public Synchronizer(List tasks, int ticksPerWriter) { * in strict ascending id order. */ public void execute() { - // add monitor and sync + StreamingMonitor monitor = new StreamingMonitor(tasks.size(),ticksPerWriter); + for (StreamWriter writer : tasks) { + writer.attachMonitor(monitor); + } for (StreamWriter writer : tasks) { Thread worker = new Thread(writer, "stream-writer-" + writer.getId()); worker.setDaemon(true); worker.start(); } + synchronized (monitor) { + while (monitor.current < monitor.total) { + try { + monitor.wait(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return; + } + } + } } } From 3f3bdd0ba8c1fca02f84a963087aeafbdc4fdfcb Mon Sep 17 00:00:00 2001 From: aurhwwh Date: Fri, 20 Mar 2026 20:19:57 +0300 Subject: [PATCH 2/2] synchronizer:trigger CI --- .../java/lectures/lecture6/tasks/synchronizer/StreamWriter.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/hse/java/lectures/lecture6/tasks/synchronizer/StreamWriter.java b/src/main/java/hse/java/lectures/lecture6/tasks/synchronizer/StreamWriter.java index 04c677ff..b1e8c48a 100644 --- a/src/main/java/hse/java/lectures/lecture6/tasks/synchronizer/StreamWriter.java +++ b/src/main/java/hse/java/lectures/lecture6/tasks/synchronizer/StreamWriter.java @@ -27,7 +27,6 @@ public void attachMonitor(StreamingMonitor monitor) { @Override public void run() { synchronized (monitor) { - // Writer threads are intentionally infinite for the task contract. while (true) { if (monitor.current>=monitor.total){ monitor.notifyAll();