Проще говоря, параллелизм — это способность запускать несколько программ или несколько частей программы параллельно. Параллелизм позволяет программе достигать высокой производительности и пропускной способности за счет использования неиспользованных возможностей базовой операционной системы и аппаратного обеспечения машины. Например, современные компьютеры имеют несколько ЦП или несколько ядер в одном ЦП, программа может использовать все ядра для некоторой части обработки; таким образом, завершая задачи намного раньше по времени по сравнению с последовательной обработкой.
Основой параллелизма Java является поток. Поток — это облегченный процесс, который имеет свой собственный стек вызовов, но может получать доступ к общим данным других потоков в том же процессе. Приложение Java по умолчанию выполняется в одном процессе. Вы можете работать со многими потоками в приложении Java для достижения параллельной обработки или параллелизма.
1. Что делает приложение Java параллельным?
В самом первом классе вам нужно будет сделать java-класс параллельным, это класс java.lang.Thread. Этот класс является основой всех концепций параллелизма в java. Затем у вас есть интерфейс java.lang.Runnable для абстрагирования поведения потока из класса потока.
Другие классы, которые вам понадобятся для создания расширенных приложений, можно найти в пакете java.util.concurrent, добавленном в Java 1.5.
2. Действительно ли параллелизм в Java настолько прост?
Вышеприведенное описание создает впечатление, что параллелизм действительно является хорошей концепцией и очень прост в реализации. Ну, это не так. Он требует хорошего понимания базовых концепций и четкого понимания целей приложения.
Параллельные приложения обычно имеют более сложную конструкцию по сравнению с однопоточными приложениями. Код, выполняемый несколькими потоками, обращающимися к общим данным, требует особого внимания. Ошибки, возникающие из-за неправильной синхронизации потоков, очень трудно обнаружить, воспроизвести и исправить. Обычно они проявляются в более высоких средах, таких как производство, и воспроизведение ошибки иногда невозможно в более низких средах.
Помимо сложных дефектов, параллелизм требует больше ресурсов для запуска приложения. Поэтому убедитесь, что у вас достаточно ресурсов в вашем арсенале.
3. Учебник по параллелизму Java
Охватить весь параллелизм Java в одном посте просто почти невозможно. Поэтому я написал ниже Учебники по параллелизму Java, обсуждая одну отдельную концепцию в одном посте. Пройдите эти руководства и дайте мне знать, если у вас есть какие-либо вопросы или предложения.
3.1 Основы параллелизма в Java
- Эволюция параллелизма
- Что такое безопасность потока?
- Как создать и начать новый поток в Java
- Установить и получить имя потока
- Убить поток
- Присоединяйтесь к теме
- Приоритет темы
- Демонические потоки
- Блокировка на уровне объектов и блокировка на уровне классов
- Алгоритм сравнения и обмена [CAS]
- методы wait(), notify() и notifyAll()
- Разрешение IllegalMonitorStateException
- Разрешение InterruptedException
3.2. Разница между
- Разница между «реализует Runnable» и «расширяет Thread»
- Разница между вызываемым и запускаемым
- Разница между замком и монитором
- Разница между yield() и join()
- Разница между sleep() и wait()?
- Разница между Semaphore и ReentrantLock
3.3 Структура исполнителя
- Учебное пособие по фреймворку Executor
- ExecutorService shutdown(), shutdownNow() и awaitTermination()
- ExecutorService invokeAll()
- ExecutorService invokeAny()
- ScheduledThreadPoolExecutor – Планирование задач с помощью исполнителей
- ScheduledExecutorService – Запуск задачи в исполнителе после задержки
- Пример FixedSizeThreadPoolExecutor
- Пример ThreadPoolExecutor
- ThreadPoolExecutor + Вызываемый + Пример будущего
- Регулирование отправки задач с помощью семафора
- Пример BlockingQueue
- Пример UncaughtExceptionHandler
- Ожидание завершения потоков
- Отменить задачу с помощью ExecutorService
- Исполнитель ОтклоненоОбработчикВыполнения
3.4. Расширенный параллелизм
- Пример ForkJoinPool
- Пример CountDownLatch
- Управление одновременным доступом с помощью семафора
- ДвоичныйСемафор
- java.util.concurrent.locks.Блокировка
- java.util.concurrent.ThreadFactory
- ThreadLocal переменные
- Межпотоковая коммуникация