readLine の代わりに、ストリームからの独自の「タイトな」読み取り (小さな bufferSize 値、たとえば一度に 8 バイト) を実装し、反復内でタイムアウトをアサートすることができます。それ以外に、IO をブロックしている場合 (以下の例では in.read 呼び出しでブロックされています)、多くのことはできません。スレッドが IO でブロックされると、割り込みに反応しません。
long timeout = 30000l; //30s
int bufferSize = 8;
ByteArrayOutputStream out = new ByteArrayOutputStream(bufferSize);
try {
long start = System.currentTimeMillis();
int byteCount = 0;
byte[] buffer = new byte[bufferSize];
int bytesRead = -1;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
byteCount += bytesRead;
if (System.currentTimeMillis() > start + timeout) {
//timed out: get out or throw exception or ....
}
}
out.flush();
return byteCount;
} ... catch ... finally ....