对available()的非阻塞调用,必须使用busy waiting with sleep对其进行轮询
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.*;
public class MyClass {
public static void main(String[] args) throws InterruptedException, ExecutionException, IOException {
MyClass myClass = new MyClass();
final InputStream in = System.in;
final long timeout = 1000;
final int result = myClass.blockingWithTimeout(in, timeout);
// final int result = myClass.nonBlockingBusyWait(in, timeout);
System.out.println("Result " + result);
}
public int nonBlockingBusyWait(final InputStream is, long timeoutMs) throws IOException, InterruptedException {
final long start = System.currentTimeMillis();
while (is.available() == 0 && (System.currentTimeMillis() < start + timeoutMs)) {
Thread.sleep(1);
}
if (is.available() == 0) {
return -1;
} else {
return is.read();
}
}
public int blockingWithTimeout(final InputStream is, long timeoutMs) throws InterruptedException, ExecutionException {
ExecutorService es = Executors.newSingleThreadExecutor();
Future future = es.submit((Callable) is::read);
try {
return future.get(timeoutMs, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
return -1;
} catch (InterruptedException | ExecutionException e) {
throw e;
} finally {
future.cancel(true);
}
}
}