В ответ на ваш отредактированный вопрос нет, производительность не снижается из-за блокировки фонового потока при вызове read()
.По сути, это как если бы фоновый поток спал.
Однако, если вы продолжаете порождать фоновые потоки и все время оставляете их заблокированными на read()
, у вас будет довольно серьезная утечка памяти в ваших руках.Это не приведет к снижению производительности с точки зрения скорости или чего-либо подобного, но в конечном итоге приведет к падению вашего приложения.
Так что да, важно убедиться, что ваши фоновые потоки в конечном итоге завершатся (или, по крайней мере, гарантировать, что ваш код не будет продолжать пытаться добавлять новые, если существующие не прекращаются).
Это должно решить оригинальную проблему:
public interface StreamDataHandler {
public void handleData(byte[] buffer, int numBytes);
public void readFailedWithError(Exception ex);
}
public class DataReader extends Thread {
private StreamDataHandler handler;
private InputStream input;
public DataReader(InputStream in, StreamDataHandler handler) {
super();
this.input = in;
this.handler = handler;
}
@Override
public void run() {
int numRead = 0;
byte[] buffer = new byte[1024];
try {
while ((numRead = input.read(buffer)) != -1) {
if (this.handler != null && numRead > 0) {
this.handler.handleData(buffer, numRead);
}
}
}
catch (Exception e) {
if (this.handler != null) {
this.handler.readFailedWithError(e);
}
}
}
}