-2

我正在使用可调用来打开包含在 finally 块中的一些输入流,由于某些令人讨厌的原因,由于我不关心的原因而引发了过早的 eof 异常。我想给可调用对象一定的时间,如果未完成则将其关闭。但是我如何也关闭可调用内的 finally 块内的东西?例如,在下面的代码中,finally 块打印“e”永远不会被执行。

ExecutorService e = Executors.newSingleThreadExecutor();
Future<Integer> f = e.submit(new Callable<Integer>() {
    public Integer call() {
        try {
            int i = 0;
            while(i<1) {
            }
        } finally {
            System.out.println("e");
        }
        return 4;
    }
});


try {
    Integer i = f.get(2, TimeUnit.SECONDS);
} catch(Exception ef) {
    System.out.println("l");
}
4

2 回答 2

1

您提供的代码示例中的finally块永远不会执行,因为没有任何路径可以让执行退出while循环。如果满足while循环终止条件或有一些代码可能会throw出现,RuntimeException那么您将看到 sysout。

于 2012-04-18T17:08:29.083 回答
1

我认为你在吠叫错误的树。如果流是套接字输入流,则应使用 Socket.setSoTimeout() 强制读取超时,如果它们是 HTTP 流,则应使用 HttpURLConnection.setReadimeout()。数据库有超时。我能想到的所有可以在读取中阻塞的东西都有超时。

于 2012-04-19T00:16:39.987 回答