Разделить 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... В любом случае, делать это самостоятельно - для меня это очень плохая идея.

Другие вопросы по тегам