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..788790c --- /dev/null +++ b/src/main/java/io/github/winroot33/NumberPrinter.java @@ -0,0 +1,42 @@ +package io.github.winroot33; + +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; + +/** + * Класс для вывода четных или нечетных чисел + * lock - объект для синхронизации + */ +@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) { + 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(); + } + } + } + +}