Разделить ConcurrentLinkedQueue на две части с помощью 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()
и т.п.
Пожалуйста, дайте мне знать правильный способ сделать это.
1 ответ
Вы не можете разделить его пополам, я имею в виду, чтобы разделить пополам, эта очередь должна иметь размер в каждый момент времени. И пока CLQ
есть size()
метод, это документация довольно ясно, что этот размер требует O(n)
время прохождения и потому, что это concurrent queue
его размер может быть не совсем точным (он называется concurrent
по причине, в конце концов). Электрический ток Spliterator
от CLQ
разбивает его на партии из того, что я вижу.
Если вы хотите логически разделить его пополам и обработать элементы, я бы предложил перейти к некоторым Blocking
реализация, которая имеет drainTo
метод, таким образом, вы можете слить элементы в ArrayList
например, это разделит намного лучше (половина, затем половина снова и так далее).
Кстати, зачем вам делать обработку в разных потоках самостоятельно? Это кажется очень нелогичным, Spliterator
предназначен для работы с параллельными потоками. призвание trySplit
один раз, вероятно, даже не достаточно - вы должны позвонить, пока он не вернется null
... В любом случае, делать это самостоятельно - для меня это очень плохая идея.