Кусок процессорного времени для потока Java

Java задняя часть JVM Операционная система
Кусок процессорного времени для потока Java

В Java потокам назначаются кванты времени ЦП для выполнения в соответствии с приоритетом, поэтому когда потоки отказываются от права использовать ЦП? Его можно разделить на три случая:

  1. Текущий запущенный поток добровольно отказывается от ЦП, а JVM временно отказывается от операции ЦП (операционная система JVM, основанная на циклическом планировании временного интервала, не позволит потоку навсегда отказаться от ЦП или отказаться от права выполнения этот временной отрезок), например вызов метода yield().

  2. Текущий поток заблокирован по какой-то причине, например, при блокировке ввода-вывода.

  3. Текущий запущенный поток завершается, то есть задача в методе run() завершена.

Третий из трех случаев понять несложно.ЦП естественно покидает после выполнения задачи.Первые два случая проиллюстрированы двумя примерами.Для начала рассмотрим ситуацию использования yield для отказа от ЦП:

public class YeildThread {
 public static void main(String[] args) {
     MyThread mt = new MyThread();
     mt.start();
     while (true) {
         System.out.println("主线程");
     }
 }
}
class MyThread extends Thread {
 public void run() {
     while (true) {
         System.out.println("被放弃线程");
         Thread.currentThread().yield();
     }
 }
}

Перехват определенного вывода выглядит следующим образом, у вывода "основной поток" больше шансов запуститься, чем у "заброшенного потока", потому что поток mt отдает квант времени основному потоку каждый раз, когда он зацикливается, именно потому, что операция yield не отдает ЦП навсегда, только Просто отдает этот квант времени, а остальное время отдает другим потокам,

主线程
主线程
主线程
主线程
主线程
主线程
被放弃线程
主线程
主线程
主线程
主线程
主线程
主线程
主线程

Во втором примере будет использоваться псевдокод для экономии объема кода. Пример простой, но он может объяснить проблему. Работающая программа будет иметь два потока для работы. Каждый раз, когда ioThread сталкивается с блокировкой ввода-вывода, он отказывается от текущего времени слайс, и основной поток откажется от текущего слайса времени, после чего он будет нормально работать в соответствии с слайсом времени, выделенным JVM.

public class IOBlockThread {
 public static void main(String[] args) {
     IOThread ioThread = new IOThread();
     ioThread.start();
     主线程任务执行
 }
}
class IOThread extends Thread {
 public void run() {
     while (true) {
         I/O阻塞
     }
 }
}

Механизм планирования потоков в Java реализован с помощью JVM.Если имеется несколько потоков, и вы хотите, чтобы некоторые потоки имели более длительное время выполнения или некоторые потоки выделяли меньшее время выполнения, тогда используется «приоритет потока».Java делит приоритет потока на 10 уровни.При создании потока, если он явно не объявлен, используется приоритет по умолчанию.JVM будет распределять вероятность времени выполнения в соответствии с приоритетом каждого потока. Есть три константы, Thread.MIN_PRIORITY, Thread.NORM_PRIORITY и Thread.MAX_PRIORITY, которые представляют минимальное значение приоритета (1), значение приоритета по умолчанию (5) и максимальное значение приоритета (10).

Поскольку реализация JVM основана на операционной системе хоста, должно быть какое-то отношение отображения между значением приоритета Java и собственными приоритетами потоков различных операционных систем, которого достаточно, чтобы инкапсулировать приоритеты всех операционных систем, чтобы обеспечить унифицированная приоритетная семантика. Например, значения приоритета 1-10 могут быть сопоставлены со значениями приоритета 0-99 в linux, тогда как 7 приоритетов должны быть сопоставлены в системе Windows.

Стратегия планирования потоков определяет механизм многопоточной работы верхнего уровня. Планировщик потоков JVM реализует упреждающее планирование. Время выполнения каждого потока распределяется и управляется им. Он будет распределять время выполнения потока в соответствии с приоритетом потока. предложение Чем выше уровень, тем дольше возможное время, чтобы получить ЦП.

------------- Рекомендуем прочитать ------------

Резюме моей статьи за 2017 год — машинное обучение

Краткое изложение моих статей за 2017 год — Java и промежуточное ПО

Резюме моих статей 2017 года — глубокое обучение

Краткое изложение моих статей за 2017 год — исходный код JDK

Резюме моей статьи за 2017 год — обработка естественного языка

Резюме моих статей 2017 года — Java Concurrency


Поговори со мной, задай мне вопросы:

这里写图片描述

Меню официальной учетной записи было разделено на «распределенное», «машинное обучение», «глубокое обучение», «НЛП», «глубина Java», «ядро параллелизма Java», «исходный код JDK», «ядро Tomcat», и т.д. Там может быть один стиль, чтобы удовлетворить ваш аппетит.

Зачем писать «Анализ проектирования ядра Tomcat»

Добро пожаловать, чтобы следовать:

这里写图片描述