有些线程跑着跑着就不见了 | 您所在的位置:网站首页 › java线程池满了任务不丢失 › 有些线程跑着跑着就不见了 |
最近接了一个业务需求,需求倒是不难,三下五除二就整理出设计方案,然后就开始代码改造。 啪,很快,就完成代码改造,然后提测给测试小姐姐。 小姐姐前面测试好好的,测到这个工程的时候,突然跟我反馈,你看这个这个工程跑着跑着就不动了,日志什么也没了。 那时候正在忙,想着我就没改几行代码,也没涉及核心逻辑,那肯定没问题的。 于是回复小姐姐,业务逻辑执行的太慢了吧,再等个半小时再看看? 一小时后,小姐姐又来找我,我都等了一小时,这个工程还是没动啊,日志还是没有啊。 这下不能拖了,上去仔细一看,还真是,怎么就没了呢? 先简单说下这段代码,就是使用一个异步线程执行一段业务逻辑,示例代码如下: // 前置逻辑 ..... Thread thread=new Thread(new Runnable() { @Override public void run() { try { // 异步线程执行其他业务逻辑 } catch (Exception e) { // 不进行任何代码处理 } } }); thread.start();凭着老程序员的经验,猜到可能是异步线程内发生了异常,导致异步线程退出,不再继续执行。而又因为上述代码「吃掉」了异常,这就导致我们从外部看起来这个工程跑着跑着就不动了,日志什么也没了。 于是改造了一下,打印出相关异常日志,最终定位问题,原来是小姐姐造的数据存在问题,从而引发 NPE 问题。 「不知道大家有没有碰到过上面的情况,使用线程异步执行相关逻辑,但是执行到一半突然就像卡主一般,不再继续往下执行。」 小黑哥碰到过几次,这几次原因都不太相同,总结起来分为下面三种情况: 异步任务长时间被阻塞 异步任务发生异常 异步任务异常被吃掉 异步任务长时间被阻塞 第一种,异步线程执行任务,这个任务需要通过网络调用其他远端服务。假设服务端响应的非常慢,而我们设置的网络超时时间又很长,这就会导致这个线程长时间被阻塞。 假设异步任务伪码如下: ThreadPoolExecutor threadPool= ....; threadPool.execute(( |
CopyRight 2018-2019 实验室设备网 版权所有 |