2

私はConcurrentLinkedQueueを持っています。これを2つの半分に分割し、それぞれ別々の2つのスレッドで処理します。 Spliteratorを使用しようとしましたが、パーティション化されたキューを取得する方法がわかりません。Spliteratorを使用してConcurrentLinkedQueueを半分に分割します

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

Spliteratorを使用してキューを2つのキューに分割することはできません。 – immibis

答えて

4

一般的に半分に分割することはできません。半分に分割することを意味します。このキューは、各時点でサイズを持つ必要があります。そしてCLQsize()メソッドを持っていますが、このサイズにはO(n)のトラバーサル時間が必要であることは明らかです。これはconcurrent queueなので、サイズは全く正確ではないかもしれません(結局理由はconcurrentです。現在SpliteratorからCLQまでは、私が見ることができるものからバッチでそれを分割します。

あなたは要素を論理的に半分に分割して処理したい場合は、私は非常に分割されますdrainTo方法を持っているいくつかのBlocking実装、あなたが例えばArrayListに要素を排出でき、このように移動することをお勧めより良い(半分、次に半分など)。

なぜ、別のスレッドで処理したいのですか?これは非常に直観的なようですが、Spliteratorは並列ストリームで動作するように設計されています。 trySplitを一度と呼ぶのは、おそらく十分ではありません。返信するまで呼び出さなければなりません。null ...いずれにしても、自分自身でこれらのことをするのは、とても悪い考えです。

+1

'null 'を返すまで呼び出す必要はありません。論理はより複雑です。しかし、特にソースが 'ConcurrentLinkedQueue'のときは、一度呼び出すだけでは十分ではありません。 – Holger

+0

@Holger私はこれが 'concurrent'構造であるという事実とは関係ないと思いますよね? – Eugene

+2

あなたはすでに問題を非常にうまく説明していますが、それは同時でリンクされているため、「正しい」数の要素を分割する簡単な方法はないため、最初の分割用の小さなバッファから実装を開始し、後続の分割ごとに、本当に大きな 'ConcurrentLinkedQueue'のために真の半分近くになる前にいくつかの' trySplit'呼び出しを静かにする必要があります。 – Holger

関連する問題