Sobes.tech
Senior

Ներմուծենք, որ ունեք երկու թել։ Մեկը տպում է (1,2,3...), մյուսը՝ (A,B,C...)։ Ինչպե՞ս ապահովել, որ նրանք կատարվեն հերթականությամբ (1,A,2,B...)։

sobes.tech AI

Պատասխան 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();
            }
        }
    }
}

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