3

所以现在我有一个相当基本的 Executor 服务,我用它来将我的程序分成线程,如下所示:

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
}

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

有人可以帮我弄这个吗?谢谢

4

3 回答 3

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){
   ...
   }

}
于 2012-09-06T15:10:34.333 回答
1

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

使用超时,您还可以检测到在任何任务返回之前何时过去了太多时间;但是,此行为的用处很大程度上取决于您的设置。

于 2012-09-06T15:27:10.410 回答
0

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

如果您的代码不支持中断,则需要对其进行修复以使其正常运行。这很难以接近可靠的方式以编程方式解决。

于 2012-09-06T15:06:38.170 回答