使用 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
... 无论哪种方式在你的自己听起来对我来说是一个非常糟糕的主意。
我有一个 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
... 无论哪种方式在你的自己听起来对我来说是一个非常糟糕的主意。