java: datainputstream: занимают ли вызовы чтения время процессора при ожидании данных? - PullRequest
1 голос
/ 16 июля 2009

Если я вызову read () для DataInputStream, будет ли он занимать циклы ЦП в ожидании данных или он выдаст текущий поток и проснется от прерывания, сигнализирующего о получении данных?

Моя мотивация состоит в том, чтобы определить, должен ли считыватель потоков находиться в собственном потоке. Блокирующее чтение, которое занимает процессорное время, не будет идеальным, так как это приведет к зависанию основного потока.

Смежный вопрос: Когда метод описывается как блокировка, подразумевается ли это, что поток выдает во время ожидания? Или нет контракта / гарантии? Мне кажется, метод, который постоянно проверяет / опрашивает данные, все еще блокирует.

Ответы [ 4 ]

3 голосов
/ 16 июля 2009

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

Блокировка подразумевает, что заблокированный поток ожидает разблокировки, в то время как другие потоки работают. Вы не обычно находите (в хорошо спроектированном коде - а не в среде выполнения Java) код ожидания, который зацикливается при опросе данных.

С другой стороны, я видел почти все в коде, который мне пришлось взять на себя: - (

1 голос
/ 16 июля 2009

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

Итак, есть немного накладных расходов. Однако, если это не так, это не должно быть проблемой. Тот факт, что вы используете DataInputStream, ни здесь, ни там. Если вы видите какие-либо конкретные проблемы с производительностью, устраните их. Производительность ввода-вывода, вероятно, будет более важной, чем производительность ЦП для операций ввода-вывода.

1 голос
/ 16 июля 2009

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

Если вы можете, используйте Java NIO, который не является блокирующим. В противном случае идеально подойдет отдельная нить.

0 голосов
/ 28 июля 2009

Вы в порядке с точки зрения многопоточности (согласно другим ответам) - нет / минимальное использование процессора при блокировке.

ОДНАКО, не ожидайте высокой производительности ввода-вывода - поскольку методы чтения InputStream синхронизируются, блокируют и выполняют проверки безопасности для КАЖДОГО байта, они довольно медленные. Если вы читаете объемные данные, загляните в NIO или прочитайте большой байт [] за раз. 1K-8K более или менее стандартен.

...