From e01e60ef842411e5ae410f369b7dec259a6f1b5b Mon Sep 17 00:00:00 2001 From: root Date: Fri, 20 Mar 2026 21:16:50 +0300 Subject: [PATCH 1/2] =?UTF-8?q?synchronizer:=20=D0=BD=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=B2=D0=B5=D1=82=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tasks/synchronizer/StreamWriter.java | 8 ++-- .../tasks/synchronizer/StreamingMonitor.java | 38 ++++++++++++++++++- .../tasks/synchronizer/Synchronizer.java | 13 ++++++- 3 files changed, 53 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..393c5885 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 @@ -28,9 +28,11 @@ public void attachMonitor(StreamingMonitor monitor) { public void run() { // Writer threads are intentionally infinite for the task contract. while (true) { - output.print(message); - onTick.run(); + try { + monitor.tick(id, onTick, output, message); + } 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..18aa38ed 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,41 @@ package hse.java.lectures.lecture6.tasks.synchronizer; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.With; + +import java.io.PrintStream; + +@Getter public class StreamingMonitor { // impl your sync here -} + private final Object key = new Object(); + private final int N; + private final int ticksPerWriter; + private int cnt = 0; + private int nowId = 1; + + public StreamingMonitor(int size, int ticksPerWriter) { + this.N = size; + this.ticksPerWriter = size * ticksPerWriter; + } + + public boolean check(){ + return cnt == ticksPerWriter; + } + + public synchronized void tick(int idCome, Runnable onTick, PrintStream output, String message) throws InterruptedException { + + while (idCome != nowId || cnt >= ticksPerWriter) { + wait(); + } + + nowId = Integer.max(1, (nowId + 1) % (N+1)); + cnt += 1; + + output.print(message); + onTick.run(); + + notifyAll(); + } +} \ No newline at end of file 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..88ad0db4 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 @@ -1,5 +1,6 @@ package hse.java.lectures.lecture6.tasks.synchronizer; +import javax.management.monitor.Monitor; import java.util.List; public class Synchronizer { @@ -22,12 +23,20 @@ public Synchronizer(List tasks, int ticksPerWriter) { * in strict ascending id order. */ public void execute() { - // add monitor and sync + StreamingMonitor streamingMonitor = new StreamingMonitor(tasks.size(), ticksPerWriter); + + for (var stream : tasks){ + stream.attachMonitor(streamingMonitor); + } + for (StreamWriter writer : tasks) { Thread worker = new Thread(writer, "stream-writer-" + writer.getId()); worker.setDaemon(true); worker.start(); } + while (!streamingMonitor.check()){ + + } } -} +} \ No newline at end of file From 487b3e3d8bbaa88bc8355198a76e4649c224a43d Mon Sep 17 00:00:00 2001 From: root Date: Fri, 20 Mar 2026 21:42:24 +0300 Subject: [PATCH 2/2] synchronizer: fix check --- .../lecture6/tasks/synchronizer/StreamingMonitor.java | 6 ++++-- .../lectures/lecture6/tasks/synchronizer/Synchronizer.java | 7 ++++++- 2 files changed, 10 insertions(+), 3 deletions(-) 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 18aa38ed..723ba26a 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 @@ -20,8 +20,10 @@ public StreamingMonitor(int size, int ticksPerWriter) { this.ticksPerWriter = size * ticksPerWriter; } - public boolean check(){ - return cnt == ticksPerWriter; + public synchronized void check() throws InterruptedException { + while(cnt < ticksPerWriter){ + wait(); + } } public synchronized void tick(int idCome, Runnable onTick, PrintStream output, String message) throws InterruptedException { 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 88ad0db4..4be7562d 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 @@ -34,9 +34,14 @@ public void execute() { worker.setDaemon(true); worker.start(); } - while (!streamingMonitor.check()){ + try { + streamingMonitor.check(); + } catch (InterruptedException e) { + throw new RuntimeException(e); } + + } } \ No newline at end of file