1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > java 线程池不抛异常 异常捕获失败问题

java 线程池不抛异常 异常捕获失败问题

时间:2020-10-07 07:36:15

相关推荐

java 线程池不抛异常 异常捕获失败问题

背景

分段执行业务时需要执行某段sql语句,由于是多个线程执行多个sql,线程之间需要使用一些读锁,若发生异常需要释放锁,结果某个线程的sql出现了错误,后台没有打印错误日志。

List<ImportModel> query = query(dataTransfer.getEngName(), sql);try {readLock.lock();arrayList.add(query);}catch (Exception e){e.printStackTrace();}finally {readLock.unlock();}

测试结果

对平时使用多线程的方式进行测试,结果发现和是否执行get方式有关,测试结果如面代码。

public Object test(String code) throws Exception{//没有抛出异常queryPool.submit(()->{try {log.info(Thread.currentThread().getName()+"的线程正在运行运行");int i=1/0;}finally {log.info("执行完毕");}});//抛出了异常queryPool.submit(()->{try {log.info(Thread.currentThread().getName()+"的线程正在运行运行");int i=1/0;}finally {log.info("执行完毕");}}).get();//抛出了异常new Thread(()->{log.info(Thread.currentThread().getName()+"的线程正在运行运行");int i=1/0;}).start();//抛出了异常queryPool.submit(new MyThread());//抛出了异常queryPool.submit(new MyThread()).get();return null;}class MyThread implements Runnable{@Overridepublic void run() {log.info(Thread.currentThread().getName()+"的线程正在运行运行");int i=1/0;}}

这种常规错误可以正常抛了,但是改成mapper查询却不行了

queryPool.submit(()->{try {log.info(Thread.currentThread().getName()+"的线程正在运行运行");List<ImportModel> importModels = dataTransferMapper.queryDepartment(sql);}finally {log.info("执行完毕");}});

之前是直接在当前方法内抛出异常可以,但是执行某个方法内部抛异常外界却拿不到,设置一个对照实验,在一个run方法内部写一个异常代码,结果果然是外界无法拿到

queryPool.submit(()->{try {log.info(Thread.currentThread().getName()+"的线程正在运行运行");run();}finally {log.info("执行完毕");}});public static void run(){int i=1/0;}

所以问题不是是否get的问题,而是一些不带throw Exception的方法,多线程执行的话最好要加上catch,否则拿不到异常信息,外界不知道发生了异常。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。