2012-09-06 109 views
3

所以现在我有我用它来打破我的程序为线,像这样一个相当基本的执行人服务:执行线程超时

ExecutorService threadPool = Executors.newFixedThreadPool(12); 
for (int i = 0; i < objectArray.length; i++) { 
    threadPool.submit(new ThreadHandler(objectArray[i], i)); 
      // The i is used elsewhere 
} 

我想知道是否有检测的好方法/关闭“崩溃”或“冻结”线程?我看了看文档,但它似乎并不适合我如何使用它...

有人可以帮助我吗?谢谢

+0

您可以保留对您提交的线程处理器的引用并定期检查它们。 –

回答

3

threadPool.submit返回Future<T>对象。所以使用这个未来的对象,你可以处理你的任务执行。 通过使用isCancelled() and isDone方法您可以检查任务已被取消或完成。更多get()正在阻止在解释或取消或执行时抛出异常的调用。

List<Future<?>> list = new ArrayList<Future<?>>(); 
for (int i = 0; i < objectArray.length; i++) { 
    Future<?> task=threadPool.submit(new ThreadHandler(objectArray[i], i)); 
      // The i is used elsewhere 
    list.add(task); 
} 
for(Future future : list){ 
    try{ 
     future.get(); 
    }catch(CancellationException cx){ 
    ... 
    }catch(ExecutionException ex){ 
    ... 
    }catch(InterruptedException ix){ 
    ... 
    } 

} 
+0

你认为你可以给我看一个这个实现的例子吗?我对如何使用未来来完成这一点有点困惑。我想我知道如何使用isCancelled/isDone,但那些不会检测是否因某种原因崩溃/停止。 –

+0

真棒解决方案,这是如何处理我的问题的一个很好的解释。 –

+0

@Damien欢迎您 –

0

所有你能做的就是中断取消任务。您可以使用ScheduledExecutorService安排要取消的任务。

如果您的代码不尊重中断,则需要对其进行修复,以便它能够执行此操作。以任何接近可靠方式的编程方式解决这个问题非常困难。

1

你有一个选择是使用ExecutorCompletionService。您通过其submit方法执行任务,然后让单独的线程等待poll(long timeout, TimeUnit unit)方法的完成。异常终止的任务将返回Futureget()将抛出ExecutionException

使用超时时间,您还可以检测任何任务返回之前何时过了太多时间;这种行为的有用性然而取决于你的设置。

+0

我真的很喜欢这个答案,因为它向我介绍了ExecutorCompletionService,这也是处理这个问题的好方法。 –