From 2be5f131dee6d09308814e44b56fe4f8282530e6 Mon Sep 17 00:00:00 2001 From: Mihail Vasilev Date: Sun, 14 Dec 2025 23:27:19 +0300 Subject: [PATCH 1/2] task finished --- src/main/java/io/github/winroot33/Main.java | 16 ++++++++- .../io/github/winroot33/NumberPrinter.java | 35 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/main/java/io/github/winroot33/NumberPrinter.java diff --git a/src/main/java/io/github/winroot33/Main.java b/src/main/java/io/github/winroot33/Main.java index 94eaa94..e3c95b2 100644 --- a/src/main/java/io/github/winroot33/Main.java +++ b/src/main/java/io/github/winroot33/Main.java @@ -1,6 +1,20 @@ package io.github.winroot33; public class Main { - public static void main(String[] args) { + public static void main(String[] args) throws InterruptedException { + int maxNumberToPrint = 500; + + NumberPrinter oddPrinter = new NumberPrinter(maxNumberToPrint, false); + NumberPrinter evenPrinter = new NumberPrinter(maxNumberToPrint, true); + + Thread oddThread = new Thread(oddPrinter); + Thread evenThread = new Thread(evenPrinter); + + oddThread.start(); + evenThread.start(); + + oddThread.join(); + evenThread.join(); + System.out.println("Work Finished"); } } \ No newline at end of file diff --git a/src/main/java/io/github/winroot33/NumberPrinter.java b/src/main/java/io/github/winroot33/NumberPrinter.java new file mode 100644 index 0000000..250c6ff --- /dev/null +++ b/src/main/java/io/github/winroot33/NumberPrinter.java @@ -0,0 +1,35 @@ +package io.github.winroot33; + +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; + +/** + * Класс для вывода четных или нечетных чисел + */ +@RequiredArgsConstructor +public class NumberPrinter implements Runnable { + + private static final Object lock = new Object(); + private static int number; + + private final int maxNumber; + private final boolean sendEven; + + @SneakyThrows + @Override + public void run() { + synchronized (lock) { + while (number <= maxNumber) { + if ((number % 2 == 0) != sendEven) { + lock.wait(); + } + + System.out.printf("Thread: %s\t Even: %s \tNumber: %d\n", + Thread.currentThread().getName(), sendEven, number); + number++; + lock.notifyAll(); + } + } + } + +} From de891747b07ae81843ff5fd60c39feb8b8fbf359 Mon Sep 17 00:00:00 2001 From: Mihail Vasilev Date: Sun, 14 Dec 2025 23:41:01 +0300 Subject: [PATCH 2/2] fix: condition, if changed to while --- src/main/java/io/github/winroot33/NumberPrinter.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/github/winroot33/NumberPrinter.java b/src/main/java/io/github/winroot33/NumberPrinter.java index 250c6ff..788790c 100644 --- a/src/main/java/io/github/winroot33/NumberPrinter.java +++ b/src/main/java/io/github/winroot33/NumberPrinter.java @@ -5,6 +5,7 @@ /** * Класс для вывода четных или нечетных чисел + * lock - объект для синхронизации */ @RequiredArgsConstructor public class NumberPrinter implements Runnable { @@ -20,13 +21,19 @@ public class NumberPrinter implements Runnable { public void run() { synchronized (lock) { while (number <= maxNumber) { - if ((number % 2 == 0) != sendEven) { + while ((number % 2 == 0) != sendEven) { lock.wait(); } + if (number > maxNumber) { + lock.notifyAll(); + return; + } + System.out.printf("Thread: %s\t Even: %s \tNumber: %d\n", Thread.currentThread().getName(), sendEven, number); number++; + lock.notifyAll(); } }