3.1. wait, notify

Wait и notify в Java - это методы, которые используются для синхронизации потоков.

wait() - метод, который заставляет текущий поток ожидать, пока другой поток не вызовет метод notify() или notifyAll() для того же объекта.

notify() - метод, который уведомляет один поток, который ожидает на объекте, что он может продолжить свою работу.

notifyAll() - метод, который уведомляет все потоки, которые ожидают на объекте, что они могут продолжить свою работу.

Эти методы используются для решения проблемы синхронизации потоков, когда один поток должен дождаться завершения работы другого потока.

Пример использования wait и notify в Java:

public class Main {
    public static void main(String[] args) {
        final Object obj = new Object();

        Thread thread1 = new Thread(() -> {
            synchronized (obj) {
                System.out.println("Поток 1: ожидание...");
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
                System.out.println("Поток 1: продолжение работы...");
            }
        });

        Thread thread2 = new Thread(() -> {
            synchronized (obj) {
                System.out.println("Поток 2: работа...");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
                System.out.println("Поток 2: уведомление...");
                obj.notify();
            }
        });

        thread1.start();
        thread2.start();
    }
}

В этом примере поток 1 ожидает на объекте obj, пока поток 2 не уведомит его о завершении своей работы. После уведомления поток 1 продолжает свою работу.