Назад к вопросам
Senior
5
class AlternatingPrinter { public static void main(String[] args) { AlternatingPrinter printer = new AlternatingPrinter(); Thread numberThread = new Thread(printer::printNumbers); Thread letterThread = new Thread(printer::printLetters); numberThread.start(); letterThread.start(); } public void printNumbers() { for (int i = 1; i <= 26; i++) { System.out.print(i + " "); } } public void printLetters() { for (char c = 'A'; c <= 'Z'; c++) { System.out.print(c + " "); } } } Предположим, у вас есть два потока. Один из них выводит (1,2,3...), а другой — (A,B,C...). Как обеспечить их выполнение в чередующейся последовательности (1,A,2,B...)?
Компании, где спрашивали
СБК ПАРУС
Ответ от нейросети
sobes.tech AI
Чтобы обеспечить чередование вывода потоков (1, A, 2, B, ...), нужно синхронизировать их работу, заставляя каждый поток ждать, пока другой не выведет свой элемент. В Java это можно сделать с помощью объекта-монитора и методов wait()/notify().
Пример реализации:
public class AlternatingPrinter {
private final Object lock = new Object();
private boolean numberTurn = true;
public static void main(String[] args) {
AlternatingPrinter printer = new AlternatingPrinter();
Thread numberThread = new Thread(printer::printNumbers);
Thread letterThread = new Thread(printer::printLetters);
numberThread.start();
letterThread.start();
}
public void printNumbers() {
for (int i = 1; i <= 26; i++) {
synchronized (lock) {
while (!numberTurn) {
try {
lock.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
System.out.print(i + " ");
numberTurn = false;
lock.notify();
}
}
}
public void printLetters() {
for (char c = 'A'; c <= 'Z'; c++) {
synchronized (lock) {
while (numberTurn) {
try {
lock.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
System.out.print(c + " ");
numberTurn = true;
lock.notify();
}
}
}
}
В этом коде один поток печатает число и переключает флаг, другой — букву, и так по очереди.