リストにオブジェクトを追加することで、複数のスレッドでサイズが大きくなっている同期化されたArrayListがあります。このリストをチャンクで読み込んでファイルに追加しておく必要があります。私は、ArrayListの最初のいくつかの要素を別のArrayListに移動し、2番目のarraylistを使用してファイルに追加できるコードを使用する必要があります。 2番目のarraylistのすべての要素は、同期されたArrayListから削除する必要があります。 synchronizedListが空になるまでこの関数を繰り返す必要があります。同じコードを提案してください。増加するリストのすべての要素を別のリストに移動する
答えて
私は@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);
ブロッキングキューを使用します。
BlockingQueue<String> queue = new ArrayBlockingQueue<>(1000);
あなたのリストに今すぐあなたのスレッドの方法でキューに追加してください。別々のスレッドで
は、次の操作を行います。@OliverCharlesworthが言ったようにwhile(queue.peek()!=null){
String s=queue.poll();
//Write to file
}
は、これがキューの仕事である、と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
}
答えをありがとう。ブロッキングキューには約100000個の文字列があります。そして、各文字列のファイルに1つずつ書き込むと、IO操作のためにオーバーヘッドが大きくなります。これを処理するための提案。 –
BufferedWriterを使用して、IOの問題に対処するのに十分な大きさのバッファサイズを設定するだけです。最後にそれをフラッシュすることを忘れないでください。 – Novaterata
- 1. 1つのリストから別のリストにli要素を移動する方法
- 2. リストの要素をリストの先頭に移動する
- 3. リストのリストをリストのすべてのリストに追加する
- 4. Haskellのリストの要素を移動するには?
- 5. SMLリストのリスト内のすべてのリストの先頭に要素を追加する方法は?
- 6. リスト要素をul要素に動的に追加する
- 7. カードゲームのリストを別のリストに移動するPython
- 8. あるリストから別のリストに要素を追加するC#
- 9. Python - リスト要素をマージして別のリストに要素として追加する
- 10. JavaScript:リストの要素を上下に移動する
- 11. appendAll - リスト内のすべてのリストにリストを追加する
- 12. Rのリストのコンポーネントに要素を動的に追加する
- 13. 他のリストにリストを移動する
- 14. リスト内のすべてのサブリストの先頭に要素を追加する
- 15. リストに別の要素が含まれているすべての要素を選択する方法
- 16. 連続するリスト要素のCSSのマージンを増やす
- 17. リスト内の要素を移動する(Python)
- 18. リストnをn個の要素で移動する方法
- 19. どのようにリストのすべての要素を移動するには、一歩前進python?
- 20. リスト内の要素間に要素を追加する
- 21. アイテムのリストを別のリストに移動します。 C#
- 22. Python:リストのリスト、すべての "サブリスト"に存在する戻り要素
- 23. prolog - リストのリストの用語から要素を追加する
- 24. リストの各要素にlispの別のリストの各要素を掛けて
- 25. ネストされたリストのすべての要素にアクセスする
- 26. リストに要素を追加する
- 27. Scala:リストに要素を追加する
- 28. リンクリストに要素リストを追加する
- 29. リストに要素を追加する
- 30. オブジェクトのリストからすべての要素を取得する
これは、クラスのプロデューサ - コンシューマのシナリオのように聞こえません。もしそうなら、実際にはこれらのリストではなくスレッドセーフ待ち行列が必要になるでしょう。 –
なぜArrayListではなくBlockingQueueを試してみませんか? – Tharun