При решении задачи я заметил поведение, которое не могу объяснить.
Моя задача состояла в том, чтобы прочитать из InputStream и прервать это чтение после истечения времени ожидания. Хотя многие люди говорят, что блокирование чтения не может быть прервано, я достиг этой цели с помощью CompletableFuture
public void startReader() {
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> doRead(System.in));
future.get(5, TimeUnit.SECONDS);
}
private void doRead(InputStream in) {
try {
new BufferedReader(new InputStreamReader(in)).readLine();
} catch (IOException e) {
e.printStackTrace();
}
}
Но когда я реализую то же самое с помощью Future
, я вижу, что TimeoutException
было брошен в JVM, но я все еще вижу, что поток чтения не был прерван и все еще работает .
public void startReader() throws ExecutionException, InterruptedException, TimeoutException {
Future<?> future = Executors.newSingleThreadExecutor().submit(() -> doRead(System.in));
future.get(5, TimeUnit.SECONDS);
}
private void doRead(InputStream in) {
try {
new BufferedReader(new InputStreamReader(in)).readLine();
} catch (IOException e) {
e.printStackTrace();
}
}
Почему такая разница? Я считаю, что CompletableFuture
не делает никаких магов c