> For the complete documentation index, see [llms.txt](https://kaze.gitbook.io/qa-theory/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kaze.gitbook.io/qa-theory/osnovy-programmirovaniya-na-java/mnogopotochnost.md).

# Многопоточность

Многопоточность в Java - это способность программы выполнять несколько потоков одновременно, что позволяет реализовывать параллельное выполнение задач и увеличивать производительность приложений. В Java многопоточность реализуется с использованием классов и интерфейсов из пакета `java.lang` и пакета `java.util.concurrent`.&#x20;

1. **Потоки (Threads)**:
   * Поток в Java представлен объектом класса `Thread` или реализует интерфейс `Runnable`.
   * Каждый поток представляет отдельный поток выполнения, который может выполнять свои инструкции параллельно с другими потоками.
   * Потоки могут выполняться одновременно (на многоядерных процессорах) или конкурентно (чередоваться на выполнение на одноядерном процессоре).
2. **Создание потоков**:
   * Потоки можно создать, наследуясь от класса `Thread` и переопределяя его метод `run()`, который содержит код, выполняемый в потоке.
   * Или можно создать класс, реализующий интерфейс `Runnable`, и передать этот объект в конструктор потока.

Пример создания потока:

```java
class MyThread extends Thread {
    public void run() {
        // Код, выполняемый в потоке
    }
}

// Создание и запуск потока
MyThread thread = new MyThread();
thread.start();
```

Пример реализации интерфейса `Runnable`:

```java
class MyRunnable implements Runnable {
    public void run() {
        // Код, выполняемый в потоке
    }
}

// Создание и запуск потока
Thread thread = new Thread(new MyRunnable());
thread.start();
```

3. **Состояния потока**:
   * Поток может находиться в различных состояниях, таких как `NEW`, `RUNNABLE`, `BLOCKED`, `WAITING`, `TIMED_WAITING`, `TERMINATED`, в зависимости от его текущей активности и условий выполнения.
4. **Синхронизация**:
   * Многопоточные приложения могут столкнуться с проблемами конкурентного доступа к общим ресурсам.
   * Для предотвращения гонок данных и других проблем синхронизации в Java используются ключевые слова `synchronized`, `volatile`, а также объекты мониторов и блокировки из пакета `java.util.concurrent`.
5. **Методы `wait()`, `notify()`, `notifyAll()`**:
   * Механизмы синхронизации, предоставляемые классом `Object`, позволяют потокам взаимодействовать друг с другом и синхронизировать свою работу.
   * `wait()` приостанавливает поток и освобождает монитор объекта.
   * `notify()` и `notifyAll()` пробуждают потоки, ожидающие на мониторе объекта, и уведомляют их о изменении состояния.
