Операция in.read(buffer)
занимает некоторое время, потому что ваша программа ожидает ввода / вывода, чтобы вернуть следующий символ.
Это так называемый blocking operation
. Из Javadoc:
This method blocks until input data is available, the end of the stream is detected, or an exception is thrown.
Итак, в этом случае каждая итерация цикла происходит не так часто, поэтому она не генерирует высокую нагрузку.
Как отметил Майк Робинсон, этот вид отключения можно также назвать busy wait
.
В вашем втором примере while(true)
ничего не ждет. Поэтому между последовательными итерациями нет задержки, и это создает очень высокую нагрузку.
Конечно, если передатчик RXTX будет очень быстрым, он может истощить ресурсы ЦП / памяти. В этом случае, возможно, было бы неплохо добавить ограничение памяти / ЦП для ваших приложений. Вы также можете читать символы в чанках (в InputStream
есть перегруженный метод read
, который может читать некоторое количество символов) и добавлять, возможно, некоторую задержку между чтениями.
Если вы знаете, что поступающий поток не будет настолько быстрым, что он истощит ресурсы вашего приложения, то подход, использованный в вашем примере, является правильным.