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