如果callable抛出timeoutexception java并打开流

时间:2012-04-18 17:01:11

标签: java io

我正在使用一个callable来打开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");
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我认为你正在咆哮错误的树。如果流是套接字输入流,则应使用Socket.setSoTimeout()强制执行读取超时,如果是HTTP流,则应使用HttpURLConnection.setReadimeout()。数据库有超时。在我能想到的读取中阻止的所有内容都会超时。