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

在项目中使用线程池时,使用了如下方式:

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值