2017-11-15 11 views
0

リストにオブジェクトを追加することで、複数のスレッドでサイズが大きくなっている同期化されたArrayListがあります。このリストをチャンクで読み込んでファイルに追加しておく必要があります。私は、ArrayListの最初のいくつかの要素を別のArrayListに移動し、2番目のarraylistを使用してファイルに追加できるコードを使用する必要があります。 2番目のarraylistのすべての要素は、同期されたArrayListから削除する必要があります。 synchronizedListが空になるまでこの関数を繰り返す必要があります。同じコードを提案してください。増加するリストのすべての要素を別のリストに移動する

+0

これは、クラスのプロデューサ - コンシューマのシナリオのように聞こえません。もしそうなら、実際にはこれらのリストではなくスレッドセーフ待ち行列が必要になるでしょう。 –

+0

なぜArrayListではなくBlockingQueueを試してみませんか? – Tharun

答えて

0

私は@Novaterataと@Tharunによって与えられた提案を使用し、最終的にLinkedBlockingQueueを使用することによって、これを達成しました。

LinkedBlockingQueue<CustomObject> sharedList = new LinkedBlockingQueue<>(); 

// Sharing the queue with multiple threads to write to it. 
new ForkJoinPool().submit(() -> logicForAddingDataToQueue(sharedList)).join(); 

および要素がリストにBlockingQueueの形成排出し、ファイルにリストを添付、10秒ごとに以下のように:

public void writeToFile(LinkedBlockingQueue<CustomObject> sharedList) { 
     List<CustomObject> subList = new ArrayList<>(); 
     sharedList.drainTo(subList); 
     FileWriterUtil.appendToFile(fileName, subList); 
     subList.clear(); 
} 
writeToFile方法は、以下のように定義される

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); 
executor.scheduleAtFixedRate(new Thread(() -> writeToFile(sharedList)){}, 1, 10, TimeUnit.SECONDS); 

1

ブロッキングキューを使用します。

BlockingQueue<String> queue = new ArrayBlockingQueue<>(1000); 

あなたのリストに今すぐあなたのスレッドの方法でキューに追加してください。別々のスレッドで

は、次の操作を行います。@OliverCharlesworthが言ったように

while(queue.peek()!=null){ 
    String s=queue.poll(); 
    //Write to file 
} 
1

は、これがキューの仕事である、とJavaで、それはのDequeインタフェースによって処理されます。

2つのリストは必要ありません。単一のデキューが必要です。BlockingLinkedDequeまたはConcurrentLinkedDeque これは、スレッドセーフティを処理します。

worker threads >> deque >> file 

ワーカースレッドは両端キューの先頭に ファイルコードポーリング追加: Comparison

両端キューは、ワークフローがそうようになる応じ に追加または削除することができる2つの側面を有しますデキューの終わりが空になり、ファイルに追加されます。

// in the workers 
dueue.addFirst(aString); 


// in the monitor 
String current; 
while((current = deque.pollLast()) != null){ 
    // append to File or buffer 
} 
+0

答えをありがとう。ブロッキングキューには約100000個の文字列があります。そして、各文字列のファイルに1つずつ書き込むと、IO操作のためにオーバーヘッドが大きくなります。これを処理するための提案。 –

+1

BufferedWriterを使用して、IOの問題に対処するのに十分な大きさのバッファサイズを設定するだけです。最後にそれをフラッシュすることを忘れないでください。 – Novaterata

関連する問題