android线程池问题

       今天项目中碰到一个棘手的问题,记录一下。

       线上突然爆出大面积点歌页面加载不出数据的问题(此处运维人员描述的不是很清晰,实际是等待一段时间之后才能加载出)。简单介绍一下页面逻辑,启用一个线程查询本地曲库,然后刷新recyclerview。拉取日志后find相关日志,发现有打印出来。此处因为运维描述错误,没有具体的关心页面进入时间与打印时间之间的差别,导致一开始的排查方向出现了错误,遂切换到正式环境,试图复现问题。

       环境切好后,发现重复进出点歌页面几次后,问题出现。经跟踪发现,线程并没有立刻被执行,排除数据库查询太久导致的问题。查看底部封装代码,发现项目里所有线程均由线程池统一调度。

     查看代码,线程池参数设置如上,于是将线程池中的线程数量打印出,发现一个很奇怪的问题。

     测试环境线程池的线程数量少且稳定

      正式环境中线程池的线程数量一直在呈现上升趋势,且释放的速度很慢

        这里讲一下线程池的规则:

        1、当前线程池大小<=核心线程池大小(corePoolSize)时,直接创建核心线程

         2、当前线程池大小 > 核心线程大小时,后面的任务会被放进缓存队列中等待,当核心线程池的线程执行完被释放后,再从缓存队列中拉取任务

        3、核心线程 + 缓存队列 > maximumPoolSize时,直接拒绝此任务

        对比发现,测试环境不会出现此问题,只有正式环境才有。每次进入页面都会创建几个线程,测试环境释放的很快,正式环境释放的比较慢,根据线程池的规则猜测,正式环境中线程任务执行较慢甚至超时,导致无法快速释放,查询曲库的线程一直在缓存队列中等待释放,因此要隔一段时间才能显示出数据。

      查看代码,果然,每次进出页面都有触发埋点,debug之,最后发现,服务端埋点服务过期没有续费,埋点接口超时,导致创建了一堆的线程无法释放,阻塞了查询曲库的线程。通知服务端人员续费,问题解决!

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值