2012-04-18 48 views
-2

我正在使用callable打开一些封装在finally块中的输入流,对于某些令人讨厌的原因,由于我不在乎的原因而抛出过早的异常。我想给callable一定的时间,然后关闭它,如果它没有完成。但我怎么也关闭可调用内部finally块内的东西? 例如,在下面的代码中,finally块打印“e”永远不会被执行。if callable throws timeoutexception java with streams open

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"); 
} 
+0

什么是'封装在[a] finally block'中的输入流?你为什么不关心早熟的EOF? “关闭finally块内的东西”是什么意思?你的例子与你的问题有什么关系?这一切都不清楚。 – EJP 2012-04-18 22:11:21

+0

我有inputstreams打开内部可调用。我希望他们在关闭的时候,如果可调用时间过去了,我希望执行程序服务来做到这一点。 – 2012-04-18 23:51:48

回答

1

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

+0

感谢这就是我需要的。 – 2012-04-19 00:17:32

1

你从来没有提供的代码示例中finally块执行,因为没有为执行逃脱while回路中的任何路径。如果while循环终止条件得到满足,或者有一些代码可能可能throw a RuntimeException那么你会看到sysout。

+0

这是有意模拟一个流。如果我想在上面的代码中超时后终止流,我该怎么办? – 2012-04-18 17:09:57

+1

声明一个'final'局部变量,其中包含您希望执行结束的时间以及每次迭代循环时检查它。 – 2012-04-18 17:13:37

+0

我正在寻找一种方法来执行executorservice或其他。 – 2012-04-18 17:23:54