Может ли HTTP-клиент Java перегружать ЦП, если сеть работает медленно

У меня есть поток, который запускает цикл, и в этом цикле он использует apache common http client для создания соединения с удаленным сервером и ПОЛУЧАЕТ некоторые данные с него, а затем некоторое время спит. Мой вопрос заключается в том, что если сеть работает медленно, может ли ЦП запустить choaking, так как метод GET займет больше времени для получения данных и, следовательно, возврата.


person abhinav    schedule 26.03.2013    source источник


Ответы (3)


Я не думаю, что это вызовет высокую нагрузку на ЦП, но ваш поток может заблокироваться на долгое время во время GET, что может привести к тому, что ваша программа будет выглядеть медленно. GET должен ожидать ввода-вывода, если сеть работает медленно, что обычно не требует много ресурсов ЦП.

person SteveP    schedule 26.03.2013
comment
поэтому, когда поток заблокирован, это означает, что поток все еще использует ЦП и ожидает возврата вызова выполнения. Это синхронный вызов???? - person abhinav; 26.03.2013
comment
Во время ожидания поток будет использовать очень мало ресурсов ЦП. Звонок синхронный. - person SteveP; 26.03.2013
comment
поэтому, если вызов является синхронным, разве это не эквивалентно вызову функции, выполнение которой занимает много времени. И, таким образом, поток будет находиться в рабочем состоянии с точки зрения процессора. Поэтому, если у нас есть много таких потоков, выполняющих такие операции, ЦП начнет тормозить. - person abhinav; 26.03.2013
comment
Поток не потребляет ЦП во время ожидания ввода-вывода. Многие объявления могут находиться в этом состоянии «ожидания», не загружая ЦП в вашей системе. - person SteveP; 26.03.2013
comment
но, где же мы заставили нить ждать. Мы только что вызвали метод execute. Как вы сказали, выполнение - это синхронный вызов. Таким образом, поток должен находиться только в рабочем состоянии. Правильно?? - person abhinav; 26.03.2013
comment
Поток находится в состоянии выполнения, но ожидает возврата данных из операции GET. Ожидание занимает очень мало ресурсов процессора. - person SteveP; 26.03.2013

Сеть — это операция ввода-вывода, обычно она выполняется периферийными устройствами, поэтому ЦП просто ждет завершения операций. Операционная система блокирует выполнение потока до завершения операции ввода-вывода. См. жизненный цикл потоков, он имеет особое состояние «заблокирован для ввода-вывода».

person kan    schedule 26.03.2013
comment
Таким образом, поток, вызвавший метод execute, все еще будет работать и ждать возврата выполнения??/ - person abhinav; 26.03.2013
comment
@abhinav бег и ожидание — два разных состояния. Что ты имеешь в виду? - person kan; 26.03.2013
comment
поэтому мой вопрос в том, что если сеть медленная, то метод выполнения займет больше времени для запуска и возврата. Таким образом, поток будет находиться в рабочем состоянии дольше. И теперь, если у меня есть много таких потоков, которые находятся в рабочем состоянии, поскольку метод выполнения не вернулся, тогда мой процессор не будет показывать высокую загрузку - person abhinav; 26.03.2013
comment
@abhinav Thread не выполняет методы, он выполняет инструкции. Если инструкция должна ждать, она чего-то ждет, например. для сигнала сетевой карты (прерывание) в вашей ситуации. Похоже, вам нужно изучить некоторые низкоуровневые вещи - как работает ОС, процессы, потоки, ввод-вывод и т. д. - person kan; 26.03.2013

нет, процессор не застрянет, а приложение застрянет (даже если у вас отдельный сетевой поток)

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

person Ankit    schedule 26.03.2013
comment
поэтому, когда поток заблокирован, это означает, что поток все еще использует ЦП и ожидает возврата вызова выполнения. Это синхронный вызов???? - person abhinav; 26.03.2013
comment
ответ отредактирован. и да, это синхронный вызов. (но только для устройства ввода-вывода) - person Ankit; 26.03.2013