У потока есть свой жизненный цикл.Процесс от создания до выполнения потока является жизненным циклом потока.Этот процесс может находиться в разных состояниях в разное время.Сколько состояний может быть у потока? Как происходит переход между разными состояниями?
Строгих правил классификации состояния потока не существует, пока состояние может быть правильно представлено, как показано на рисунке, сначала посмотрите на одну из классификаций состояний Поток может находиться в нескольких состояниях от создания до смерти , но в любой момент времени поток может находиться только в одном из этих состояний, а всего существует пять состояний: новый, работоспособный, работающий, неработоспособный и мертвый.
Преобразованием состояния потока может управлять программа, а эффект преобразования может быть достигнут через некоторые API, такие как запуск, остановка, сон, приостановка, возобновление, ожидание, уведомление и другие методы класса Thread ( остановить, приостановить, возобновить и другие методы легко привести к смерти (проблема с блокировкой и уже давно устарела).
- New (новый): Поток создан, но не запущен и находится в новом состоянии, то есть экземпляр потока, созданный с помощью new MyThread(); в программе находится в этом состоянии.
- Готовность к выполнению: созданный экземпляр потока переходит в состояние готовности к выполнению после вызова метода start(). Поток в этом состоянии не обязательно означает, что он находится в состоянии выполнения. Стратегия планирования потоков, используемая многопоточностью Java, — превращается в квант времени ЦП, который можно представить как пул исполняемых потоков.Метод start() помещает потоки в пул исполняемых потоков, а ЦП выполняет потоки в пуле один за другим в соответствии с определенными правилами.
- Работа (выполнение): когда ЦП получает квант времени выполнения потока, т. е. в рабочее состояние.
- Невыполняемый: работающий поток по какой-то причине временно отказывается от права на использование ЦП, возможно, потому, что он выполняет такие операции, как приостановка, спящий режим или ожидание.При выполнении операций ввода-вывода скорость внешних устройств намного ниже. скорости процессора поток может временно отказаться от использования ЦП.В процессе получения блокировки синхронизации объекта, если блокировка синхронизации сначала занята другим потоком, поток может временно отказаться от ЦП.
- Мертвый: Поток завершает выполнение задачи, реализованной методом run(), или выходит из задачи из-за исключения.После перехода потока в мертвое состояние он не может быть преобразован в другие состояния.
Продолжайте подразделять неработоспособное состояние, как показано на рисунке, определение и преобразование четырех состояний нового, работоспособного, работающего и мертвого такие же, как и предыдущие, с акцентом на три состояния, полученные из неработоспособного состояния. состояние: блокировка (блокировано), блокировка синхронизации (заблокировано), ожидание (ожидание).
- Заблокировано (заблокировано): Блокировка инициируется событием блокировки.Если поток находится в заблокированном состоянии, он откажется от права использовать ЦП и временно прекратит работу. Как правило, если поток выполняет методы sleep(), join() или выдает запрос ввода-вывода, поток будет в заблокированном состоянии, а в конце он вернется в исполняемое состояние, ожидая выделения ЦП.
- Синхронизированная блокировка (заблокирована): если поток собирается вызвать метод синхронизации, а объект, соответствующий методу синхронизации, занят другими потоками, поток войдет в состояние блокировки синхронизации. По сути, каждый объектный объект в Java имеет монитор, отвечающий за эксклюзивную обработку домена синхронизации во время параллелизма, то есть когда поток вызывает метод синхронизации объекта, JVM будет определять, является ли монитор измененного объект занят. , если он не занят, поток получит право собственности на монитор и продолжит выполнение метода синхронизации объекта, в противном случае поток будет брошен в очередь ожидающих потоков в очередь, пока монитор не будет освобожден, все ожидающие потоки продолжают конкурировать за владение монитором, захват После того, как монитор становится владельцем, он переходит в состояние исполняемого файла и ожидает выделения ЦП, прежде чем он сможет выполнить метод синхронизации.
- Ожидание: работающий поток переходит в состояние ожидания после выполнения метода wait(). Объект, который выполняет метод wait(), также заставит поток войти в очередь ожидающих потоков объекта, а также снимет блокировку объекта, то есть откажется от владения монитором. Только когда методы notify() и notifyAll() вызываются для объекта в других потоках, будут пробуждены потоки в очереди ожидающих потоков. потоки в очереди ожидания после того, как все потоки будут пробуждены, будут конкурировать за контроль над владением объектом, а поток, получивший право собственности, может быть преобразован в исполняемое состояние, ожидая выделения ЦП для выполнения, и другие потоки продолжают ждать.
------------- Рекомендуем прочитать ------------
Резюме моей статьи за 2017 год — машинное обучение
Краткое изложение моих статей за 2017 год — Java и промежуточное ПО
Резюме моих статей 2017 года — глубокое обучение
Краткое изложение моих статей за 2017 год — исходный код JDK
Резюме моей статьи за 2017 год — обработка естественного языка
Резюме моих статей 2017 года — Java Concurrency
Поговори со мной, задай мне вопросы:
Меню официальной учетной записи было разделено на «Сводка для чтения», «Распределенное», «Машинное обучение», «Глубокое обучение», «НЛП», «Глубина Java», «Ядро параллелизма Java», «Исходный код JDK», "Tomcat Core" "Подождите, может быть, есть тот, который соответствует вашему аппетиту.
Зачем писать «Анализ проектирования ядра Tomcat»
Добро пожаловать, чтобы следовать: