Что означает время простоя потока в Java?

В чем смысл простоя по отношению к потокам в Java? Я читаю Java Полный справочник, 8-е издание и он говорит что-то вроде этого:

...One thread can pause without stopping other parts of your program. For example, the idle time created when a thread reads data from a network or waits for user input can be utilized elsewhere...

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
990
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

В данном случае это означает, что состояние потока WAITING или TIMED_WAITING, что означает

A thread in the waiting state is waiting for another thread to perform a particular action.

Я не понял, что такое бездействие, потому что я не носитель английского языка, поэтому, если я правильно понял, «бездействие» означает время ожидания потока?

Luiz Fernando 28.06.2019 18:46

@ Луис Фернандо, да. Английское слово «Idle» означает «не занят», «не работает» или «не используется». Часто это имеет негативный оттенок, например: «Этот человек не должен быть праздный, он должен работать!» или «Эта машина слишком часто оказывается праздный, мы должны найти способ заработать на ней немного денег или продать ее».

Solomon Slow 28.06.2019 22:29

Представьте, что есть только один процессор. Есть две вещи, которые пользователь хочет сделать.

1) Загрузите песню и воспроизведите ее (скажем, загрузка песни занимает 10 секунд, чтобы получить сетевое подключение, загрузите ее в течение 5 секунд и воспроизведите в течение 60 секунд). 2) Скопируйте другой файл из одной папки в другую (скажем, копирование файла занимает 3 секунды).

В этом случае, если есть только один поток, то этот поток ждет 10 секунд, чтобы установить соединение, и 5 секунд, чтобы загрузить, воспроизвести песню в течение 60 секунд, а затем скопировать другой файл в течение 3 секунд.

При всем этом, когда поток ожидает 10 секунд, чтобы получить сетевое соединение, ничего не делается, пока он действительно не получит соединение, и просто бездействует, ничего не делая. Теперь, когда поток простаивает, ЦП не используется. Теперь, когда это так, должен быть другой поток, тогда этот поток мог бы использоваться для 3-секундной копии файла, когда первый поток ожидает 10 секунд, чтобы получить сетевое соединение.

В первом случае 10 сек называется простоем

Я могу попытаться объяснить это дальше на примере, который содержит серию событий.

Простая программа читает пользовательского ввода, пишет в базу данных и статус отчеты обратно пользователю.

Последовательность операций:

  1. Читать IO пользователя [thread A]
  2. Обработайте его и запишите в базу данных [thread B]
  3. Сообщает о статусе пользователю [thread A]

Выше thread A будет приостанавливаться после последовательности 1, пока она не будет разблокирована thread B. Таким образом, пока выполняется последовательность 2, thread A находится в состоянии ожидания.

Поток может находиться в двух состояниях: в состоянии ожидания или в рабочем состоянии. Рабочий поток занимает центральный процессор и выполняет некоторую программу. Простой поток не занимает ЦП, а только основную память. Любой бездействующий поток ожидает какого-либо события и поэтому связан с соответствующей очередью событий.

Например, у монитора есть 2 очереди: одна для потоков, пытающихся выполнить оператор synchronized, а другая для потоков, вызвавших метод Object.wait().

Когда происходит событие, один или все потоки берутся из очереди событий и помещаются в очередь процессора, где они ждут освобождения ЦП. Когда процессор освобождается, он берет следующий поток из очереди процессора и начинает выполнять свой код с того места, где запросил какое-то событие, и попал в очередь.

Реальные состояния потоков JVM отличаются от этой упрощенной картины.

Другие вопросы по теме