ログサーバーのリスナーであるクラスがあります。ログ/テキストが吐き出されるたびに、リスナーに通知されます。このテキストを配列リストに保存します。
このテキストを処理する必要があります (重複する単語を削除し、トライに保存し、いくつかのパターンと比較するなど)。
私の質問は、リスナーに通知されたときにこれを行うべきですか? または、処理を処理する別のスレッドを作成する必要があります。
この状況を処理する最善の方法は何ですか?
ログサーバーのリスナーであるクラスがあります。ログ/テキストが吐き出されるたびに、リスナーに通知されます。このテキストを配列リストに保存します。
このテキストを処理する必要があります (重複する単語を削除し、トライに保存し、いくつかのパターンと比較するなど)。
私の質問は、リスナーに通知されたときにこれを行うべきですか? または、処理を処理する別のスレッドを作成する必要があります。
この状況を処理する最善の方法は何ですか?
Producer Consumer Problemを解決しようとしているように聞こえますが、その場合は -はい、スレッドを見る必要があります。
ただし、エントリごとに数ミリ秒もかからない非常に基本的な操作のみを実行する必要がある場合は、過度に複雑にしないでください。TreeSet を ArrayList と組み合わせて使用すると、重複を自動的に排除します。ログエントリの検証などの単純なアトミック操作は、別のスレッドを必要とするほど大したことではありません。ただし、新しいテキストが非常に速い速度で入ってきて、スレッドが新しい通知の処理でフルタイムでビジー状態になる必要がある場合を除きます。 .
UIに関連しないプロセスは、常にそのタイプのプロセスを別のスレッドで実行するため、アプリの画面がハングすることはありません。したがって、私の観点としては、別のスレッドを使用する必要があります。
このような状況は、キューを使用して解決できます。最も簡単な解決策は、無制限のブロッキングキュー(LinkedTransferQueueはそのような場合に合わせて調整されます)と制限されたサイズのワーカースレッドのプールを持つことです。リスナーのスレッドからのログエントリをadd() / offer()し、ワーカースレッドで処理するためにtake()を実行します。処理可能なログエントリがない場合、 take()はスレッドをブロックします。
PS LinkedTransferQueueは同時使用用に設計されており、外部同期は必要ありません。ConcurrentDSファミリーと同様に、弱いイテレーターに基づいています。