谁能指导我如何在Java中使用简单超时?基本上在我的项目中,我正在执行br.readLine()语句,该语句正在读取调制解调器的响应。但是有时调制解调器没有响应。为此,我想添加一个超时。
我正在寻找类似的代码:

try {
    String s= br.readLine();
} catch(TimeoutException e) {
    System.out.println("Time out has occurred");
}

最佳答案

您正在寻找的内容可以在here中找到。可能存在一种更优雅的方式来实现该目标,但是一种可能的方式是

选项1(首选):

final Duration timeout = Duration.ofSeconds(30);
ExecutorService executor = Executors.newSingleThreadExecutor();

final Future<String> handler = executor.submit(new Callable() {
    @Override
    public String call() throws Exception {
        return requestDataFromModem();
    }
});

try {
    handler.get(timeout.toMillis(), TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
    handler.cancel(true);
}

executor.shutdownNow();

选项2:
final Duration timeout = Duration.ofSeconds(30);
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);

final Future<String> handler = executor.submit(new Callable() {
    @Override
    public String call() throws Exception {
        return requestDataFromModem();
    }
});

executor.schedule(new Runnable() {
    @Override
    public void run(){
        handler.cancel(true);
    }
}, timeout.toMillis(), TimeUnit.MILLISECONDS);

executor.shutdownNow();

这些只是草稿,因此您可以了解主要思想。

09-27 00:34
查看更多