934просмотров
13.5%от подписчиков
4 декабря 2024 г.
Score: 1.0K
Многопоточность в 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); Многопоточность — мощный инструмент для улучшения производительности приложений, но требует внимательности при реализации, чтобы избежать ошибок, таких как мертвые блокировки или некорректный доступ к данным. 👉