线程池中捕获线程执行异常
2015-08-17 16:32
351 查看
在项目中使用线程池时,使用了如下方式:
但是这种方式下,主线程无法捕获子线程中的异常,也就无法在子线程出现异常时采取措施。
如果换一个实现方式就可以捕获子线程异常,步骤如下:
1. 以submit方式提交执行并返回Future对象
2. 执行Futrue的get方法获取执行结果
3. 捕获get方法抛出的执行异常
dataDao需要实现Callable接口并实现call方法:
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; } }
相关文章推荐
- Ruby中的异常处理代码编写示例
- C#线程间不能调用剪切板的解决方法
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#线程同步的三类情景分析
- C#子线程更新UI控件的方法实例总结
- MySQL抛出Incorrect string value异常分析
- C++使用CriticalSection实现线程同步实例
- c++线程池实现方法
- 基于C++实现的线程休眠代码
- VB读取线程、句柄及写入内存的API代码实例
- C#网络编程基础之进程和线程详解
- C#多线程处理多个队列数据的方法
- C#实现线程安全的简易日志记录方法
- C#中线程同步对象的方法分析
- ASP.NET线程相关配置
- 浅析linux环境下一个进程最多能有多少个线程
- 再谈JavaScript线程
- 详解JavaScript中的异常处理方法
- C#实现终止正在执行的线程
- java程序中的延时加载异常及解决方案