Senior
32
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...)?
Сұралған компаниялар
СБК ПАРУС
AI-дан жауап
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();
}
}
}
}
В этом коде один поток печатает число и переключает флаг, другой — букву, и так по очереди.