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();
}
}
Объяснение:
- Общий объект lock: используется для синхронизации потоков.
- Флаг tickTurn: управляет порядком вывода “Тик” и “Так”.
- Потоки вызывают метод
tick()илиtock(), проверяя флагtickTurn. - Потоки используют
wait()для ожидания своей очереди иnotify()для пробуждения другого потока. - Потоки выводят “Тик” или “Так” с задержкой в 1 секунду (
Thread.sleep(1000)), обеспечивая интервал между выводами.
Код выводит:
Тик
Так
Тик
Так
Тик
Так
Тик
Так
Тик
Так