使用 Spliterator 将 ConcurrentLinkedQueue 分成两半

Split a ConcurrentLinkedQueue into half using Spliterator

我有一个 ConcurrentLinkedQueue,我想将它分成两半,让两个单独的线程分别处理。我试过使用 Spliterator,但我不明白如何获得分区队列。

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() 等等

请告诉我正确的做法。

一般情况下你不能把它分成两半,我的意思是分成两半这个队列必须在每个时间点都有一个大小。虽然 CLQ 确实有一个 size() 方法,但文档很清楚这个大小需要 O(n) 遍历时间,因为这是一个 concurrent queue 它的大小可能不准确全部(毕竟它被命名为 concurrent 是有原因的)。 CLQ 中的当前 Spliterator 从我所看到的分批拆分它。

如果你想在逻辑上将它分成两半并处理元素,那么我建议转向一些具有 drainTo 方法的 Blocking 实现,这样你就可以将元素排空到一个 ArrayList 例如,它会分裂得更好(一半,然后再一半,依此类推)。

附带说明一下,您为什么要 自己 在不同的线程中进行处理?这似乎非常违反直觉,Spliterator 旨在用于并行流。调用 trySplit 一次 可能还不够 - 你必须调用它直到它 returns null... 无论哪种方式在你的自己听起来对我来说是一个非常糟糕的主意。