LinkedBlockingQueue.offer 为什么阻塞?

10 天前
 AoEiuV020JP
最近在做优化,android java,
性能分析时意外发现这个 offer 占用了不大不小的时间,
具体是个线程池(Executors.newFixedThreadPool)用到 new LinkedBlockingQueue<Runnable>(), 大量 submit 任务时 offer 耗时了,挺意外的,
不管怎么搜索都是告诉我 offer 不会等待, 那为什么 offer 耗时这么大呢?
而且 offer 中耗时的方法名是“art_jni_trampoline”, 看起来是安卓相关的,这不在 offer 源码里, 不知道这说明什么,

1157 次点击
所在节点    Android
4 条回复
hysli
10 天前
是不是任务太多,导致队列满了,队列满了就会等待吧。
AoEiuV020JP
10 天前
@hysli #1 任务是太多,但一方面 LinkedBlockingQueue 默认参数队列是无上限的, 一方面 offer 遇到队列满了会直接返回不会阻塞,所以很奇怪,
ysc3839
10 天前
感觉是在等待锁
sinalvee
10 天前
LinkedBlockingQueue 有 putLock 和 takeLock 两个锁,offer 方法要获取 putLock ,默认参数的时无界队列所以不会直接返回 false ,任务太多了等待锁的时间就会变长

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1071602

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX