您的位置:首页 > 其它

线程池中捕获线程执行异常

2015-08-17 16:32 351 查看
在项目中使用线程池时,使用了如下方式:

ExecutorService dataUploadPool = Executors.newFixedThreadPool(writeThreadNum);

dataUploadPool.execute(new Thread(task))


但是这种方式下,主线程无法捕获子线程中的异常,也就无法在子线程出现异常时采取措施。

如果换一个实现方式就可以捕获子线程异常,步骤如下:

1. 以submit方式提交执行并返回Future对象

2. 执行Futrue的get方法获取执行结果

3. 捕获get方法抛出的执行异常

final ExecutorService dataUploadPool = Executors.newFixedThreadPool(writeThreadNum);

List<Future> results = new ArrayList<>();

for (File f : file.listFiles()) {
if (f.isDirectory()) {
....
results.add(dataUploadPool.submit(dataDao));
}
}
}

// 关闭线程池
dataUploadPool.shutdown();

// 检查线程池中线程是否抛出异常,若异常则退出执行
for (Future task : results) {
try {
task.get();
} catch (Exception e) {
logger.error(e.getMessage(), e);
return;
}
}


dataDao需要实现Callable接口并实现call方法:

public abstract class AbstractDao implements Callable<Boolean> {
@Override
public Boolean call() throws Exception {
loadDataFromFileToDB();
return true;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线程池 线程 异常