所以现在我有一个相当基本的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
}
我想知道是否有一种检测/关闭“崩溃”或“冻结”线程的好方法?我看一下文档,但它似乎并不适合我如何使用它...
有人可以帮我吗?感谢
答案 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){
...
}
}
答案 1 :(得分:1)
您拥有的一个选项是使用ExecutorCompletionService
。您通过其submit
方法执行任务,然后使用单独的线程等待poll(long timeout, TimeUnit unit)
方法的完成。以异常终止的任务将返回Future
,get()
将ExecutionException
抛出{{1}}。
使用超时,您还可以检测在任何任务返回之前已经过了太多时间;然而,这种行为的有用性在很大程度上取决于你的设置。
答案 2 :(得分:0)
您所能做的就是中断已取消的任务。您可以使用ScheduledExecutorService
计划要取消的任务如果您的代码不支持中断,则需要对其进行修复。这很难以可靠的方式以编程方式解决。