java中的简单超时

新手上路,请多包涵

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

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

原文由 Yuvraj 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 533
1 个回答

您正在寻找的可以在 这里 找到。可能存在一种更优雅的方法来实现这一点,但一种可能的方法是

选项 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();

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

原文由 Trein 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题