首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Spliterator将ConcurrentLinkedQueue拆分为两部分

使用Spliterator将ConcurrentLinkedQueue拆分为两部分
EN

Stack Overflow用户
提问于 2017-11-23 23:08:06
回答 1查看 425关注 0票数 2

我有一个ConcurrentLinkedQueue,我想把它分成两半,让两个单独的线程处理每个线程。我尝试过使用Spliterator,但是我不知道如何获得分区队列。

代码语言:javascript
复制
ConcurrentLinkedQueue<int[]> q = // contains a large number of elements
Spliterator<int[]> p1 = q.spliterator();
Spliterator<int[]> p2 = p1.trySplit();
p1.getQueue(); 
p2.getQueue();

我想但不能做p1.getQueue()等。

请让我知道正确的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-24 08:02:22

一般来说,你不能把它分成两半,我的意思是把它分成两半,这个队列必须在每个时间点都有一个大小。虽然CLQ确实有一个size()方法,但是它的文档非常清楚,这个大小需要O(n)遍历时间,而且由于它是一个concurrent queue,所以它的大小可能根本不准确(毕竟它被命名为concurrent是有原因的)。来自CLQ的当前CLQ将它从我所看到的分批分割开来。

如果您想在逻辑上将其拆分为两部分并处理元素,那么我建议移到一些具有drainTo方法的drainTo实现中,这样您就可以将元素提取到ArrayList中--例如,这会更好地拆分(一半,然后再来,等等)。

另外,为什么要自己在不同的线程中进行处理呢?这似乎非常违背直觉,Spliterator是为并行流设计的。调用trySplit一次可能还不够--您必须调用它直到它返回null.不管是哪种方式,你自己做这些事对我来说都是个坏主意。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47464346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档