Реализовать код для отображения "Тик" и "Так" с разницей в одну секунду, используя два потока

5. Реализовать код для отображения "Тик" и "Так" с разницей в одну секунду, используя два потока

  • Один поток должен печатать “Тик”, а другой — “Так”.
  • Потоки должны работать с разницей в одну секунду.
Спойлеры к решению
Подсказки
  • Для синхронизации потоков можно использовать wait() и notify() или notifyAll().
  • Используйте общий объект или блок синхронизации для координации потоков.
Решение

Вот пример кода для реализации задачи:

public class TickTock {
    private final Object lock = new Object();
    public void tick() {
        synchronized (lock) {
            System.out.println("Тик");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            lock.notify();
            try {
                lock.wait();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
    public void tock() {
        synchronized (lock) {
            System.out.println("Так");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            lock.notify();
            try {
                lock.wait();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

    public static void main(String[] args) {
        TickTock tickTock = new TickTock();

        Thread tickThread = new Thread(() -> {
            while (true) {
                tickTock.tick();
            }
        });

        Thread tockThread = new Thread(() -> {
            while (true) {
                tickTock.tock();
            }
        });

        tickThread.start();
        tockThread.start();
    }
}

Объяснение:

  1. Общий объект lock: используется для синхронизации потоков.
  2. Флаг tickTurn: управляет порядком вывода “Тик” и “Так”.
  3. Потоки вызывают метод tick() или tock(), проверяя флаг tickTurn.
  4. Потоки используют wait() для ожидания своей очереди и notify() для пробуждения другого потока.
  5. Потоки выводят “Тик” или “Так” с задержкой в 1 секунду (Thread.sleep(1000)), обеспечивая интервал между выводами.

Код выводит:

Тик
Так
Тик
Так
Тик
Так
Тик
Так
Тик
Так