背景
分段执行业务时需要执行某段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,否则拿不到异常信息,外界不知道发生了异常。