如果可调用抛出timeoutexception java,并打开流

如果可调用抛出timeoutexception java,并打开流,java,io,Java,Io,我正在使用callable打开一些包含在finally块中的inputstreams,由于一些恼人的原因,这些块会抛出过早的eof异常,原因我并不关心。我想给callable一段时间,如果它没有完成,就把它关掉。但是我如何关闭可调用的finally块中的东西呢? 例如,在下面的代码中,最终块打印“e”永远不会执行 ExecutorService e = Executors.newSingleThreadExecutor(); Future<Integer> f = e.submit(

我正在使用callable打开一些包含在finally块中的inputstreams,由于一些恼人的原因,这些块会抛出过早的eof异常,原因我并不关心。我想给callable一段时间,如果它没有完成,就把它关掉。但是我如何关闭可调用的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");
}
ExecutorService e=Executors.newSingleThreadExecutor();
Future f=e.submit(新的可调用(){
公共整数调用(){
试一试{
int i=0;

虽然(i您提供的代码示例中的
finally
块从未执行,因为没有任何路径可供执行来逃避
while
循环。如果满足
while
循环终止条件,或者有某段代码可能
抛出
运行时异常
,则您将您将看到sysout。

我认为您找错了方向。如果流是套接字输入流,则应使用socket.setotimeout()强制执行读取超时,或使用HttpURLConnection.setReadimeout()强制执行读取超时如果它们是HTTP流。数据库有超时。我能想到的任何可以阻止读取的东西都有一个超时。

这是为了模拟流。如果我想在上述代码中超时后终止流,我该怎么办。声明一个
final
局部变量,其中包含希望执行结束流的时间在循环的每一次迭代中检查它。我一直在寻找一种从executorservice或其他东西中实现这一点的方法。什么是[a]中包含的“输入流”finally block'?你为什么不关心过早的EOF?你所说的“关闭finally block中的东西”是什么意思?你的例子与你的问题有什么关系?这是最不清楚的。我在一个可调用的内部打开了输入流。我希望在可调用的时间用完时关闭它们,并且我希望ecutor服务来做这件事。