Ответ
Многопоточность — это модель выполнения, при которой в рамках одного процесса Java (JVM) параллельно работают несколько потоков (threads). Потоки разделяют общую память процесса (heap), но имеют собственные стеки вызовов и локальные переменные.
Преимущества:
- Повышение производительности: Использование нескольких ядер CPU для вычислений.
- Улучшение отзывчивости: Главный поток (например, UI) не блокируется длительными операциями (I/O, сетевые запросы).
- Эффективное использование ресурсов: Пока один поток ожидает I/O, другие могут выполняться.
Базовый пример создания потока:
// 1. Наследование от Thread
class MyThread extends Thread {
@Override
public void run() {
System.out.println("Поток работает: " + getName());
}
}
// Запуск: new MyThread().start();
// 2. Реализация Runnable (предпочтительнее)
Runnable task = () -> {
System.out.println("Поток работает: " + Thread.currentThread().getName());
};
// Запуск: new Thread(task).start();
Ключевые проблемы и решения:
| Проблема | Описание | Решение в Java |
|---|---|---|
| Гонка данных (Race Condition) | Непредсказуемый результат из-за порядка выполнения потоков. | Синхронизация (synchronized), атомарные классы (AtomicInteger). |
| Взаимная блокировка (Deadlock) | Два и более потока бесконечно ждут друг друга. | Упорядоченное захватывание блокировок, использование tryLock с таймаутом. |
| Видимость изменений | Изменения переменной одним потоком не видны другому. | Ключевое слово volatile, синхронизация. |
Для сложных задач используйте высокоуровневые API из пакета java.util.concurrent (пулы потоков, ExecutorService, Future, ConcurrentHashMap).