Sobes.tech
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();
            }
        }
    }
}

В этом коде один поток печатает число и переключает флаг, другой — букву, и так по очереди.