Многопоточность в Java В Java многопоточность реализована через класс
Thread и интерфейс
Runnable. Вот основные моменты, которые могут быть полезны при работе с многопоточностью:
🔵1.
Создание и запуск потока - Поток может быть создан двумя способами:
-
Наследование от класса Thread:
class MyThread extends Thread {
public void run() {
// Код, выполняемый в потоке
}
}
MyThread t = new MyThread();
t.start();
-
Реализация интерфейса Runnable:
class MyRunnable implements Runnable {
public void run() {
// Код, выполняемый в потоке
}
}
Thread t = new Thread(new MyRunnable());
t.start();
🔵2.
Основные методы класса Thread -
start() — запуск потока.
-
sleep(long millis) — приостановка потока на определенное время.
-
join() — ожидание завершения потока.
-
interrupt() — прерывание потока.
-
isAlive() — проверка, работает ли поток.
🔵3.
Синхронизация - Чтобы избежать проблем с конкурентным доступом к данным, используется
синхронизация:
synchronized (this) {
// Критическая секция
}
Это гарантирует, что только один поток может выполнить код внутри синхронизированного блока.
🔵4.
Пул потоков - Для управления большим количеством потоков используется
пул потоков, который управляется через
ExecutorService. Пример:
ExecutorService executor = Executors.newFixedThreadPool(10);
executor.submit(() -> {
// Задача для потока
});
executor.shutdown();
🔵5.
Состояния потока Потоки могут находиться в разных состояниях:
-
NEW: Поток создан, но не запущен.
-
RUNNABLE: Поток готов к выполнению.
-
WAITING: Поток ожидает другого потока.
-
TIMED_WAITING: Поток ожидает в течение определенного времени.
-
TERMINATED: Поток завершен.
🔵6.
Проблемы многопоточности -
Состояние гонки (Race condition) — ситуация, когда несколько потоков одновременно пытаются изменить данные, что может привести к некорректным результатам.
-
Блокировки — проблемы с мертвыми блокировками (deadlocks), когда потоки навсегда блокируются, ожидая друг друга.
🔵7.
Современные подходы и классы -
ForkJoinPool — используется для параллельного выполнения задач с разделением на подзадачи.
-
CountDownLatch, CyclicBarrier, Semaphore — различные утилиты для синхронизации между потоками.
🔵8.
Параллельное выполнение коллекций - Коллекции в Java также могут работать с потоками через
parallelStream():
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.parallelStream().forEach(System.out::println);
Многопоточность — мощный инструмент для улучшения производительности приложений, но требует внимательности при реализации, чтобы избежать ошибок, таких как мертвые блокировки или некорректный доступ к данным.
👉
@java_geek