如今,您可以使用
try {
String s = CompletableFuture.supplyAsync(() -> br.readLine())
.get(1, TimeUnit.SECONDS);
} catch (TimeoutException e) {
System.out.println("Time out has occurred");
} catch (InterruptedException | ExecutionException e) {
// Handle
}
编辑:poseidon正确地指出,在超时的情况下,上述方法不会中断正在处理Future任务的基础线程。在没有中断的情况下,底层线程将继续处理未来的任务直至完成,而无法知道结果是否不再需要。通过中断,底层线程至少可以看到(如果它检查)它已被中断,从而允许它优雅地完成处理并退出。
对于 JDK 中执行阻塞 IO 的方法,按照约定,它们的实现是检查调用线程的中断状态(如果为 true,则抛出 InterruptedException)。因此,中断线程可以使其快速退出,即使可能无限等待的情况,例如从输入源读取。
无需进一步阐述,如果我们想在超时时中断底层 Thread,我们可以调整:
Future<String> future = CompletableFuture.supplyAsync(() -> br.readLine());
try {
String s = future.get(1, TimeUnit.SECONDS);
} catch (TimeoutException e) {
System.out.println("Time out has occurred");
future.cancel(true);
} catch (InterruptedException | ExecutionException e) {
// Handle
}