2012-04-10 11 views
4

私は、ログサーバーのリスナーであるクラスを持っています。リスナーはログ/テキストが吐き出されるたびに通知を受け取ります。私はこのテキストをarraylistに保存します。テキストの継続的な解析と処理

私はこのテキストを処理する必要があります(重複する単語を削除し、トライで保存し、いくつかのパターンと比較するなど)。

私の質問は、リスナーに通知されたときにこれを行うべきですか?または、処理を処理する別のスレッドを作成する必要があります。

この状況を処理する最善の方法は何ですか?

+0

もう一度編集してタイプミスを修正し、さらに明確にすることはできますか? – Alain

+0

リスナーはどのくらいの頻度で通知されますか?テキストを処理するのにどれくらい時間がかかりますか?テキストを処理するのに費やされた時間のうち、実際にファイルを読むのにどれくらい時間がかかりましたか?あなたのニーズにスレッディングが必要かどうかを決定する多くの要素がありますが、私はあなたが望む通りのスレッディングがあると思います。 – twain249

答えて

2

Producer Consumer Problemを解決しようとしているような音です。この場合、はいと表示されます。

ただし、非常に基本的な操作を行う必要があるのは、1エントリあたりのミリ秒未満です。複雑すぎることはありません。 TreeListをArrayListとともに使用すると、重複を自動的に保持します。ログエントリの検証などの単純なアトミック操作では、新しいテキストが完全に時間切れになり、新しい通知を処理するためにスレッドを必要とするような高速な速度で新しいテキストが入力されない限り、別々のスレッドが必要です。

1

UIに関連していないプロセスは、常にそのタイプのプロセスを別のスレッドで実行するため、アプリケーション画面がハングしません。だから私の見解では、あなたは別の糸で行く必要があります。

1

このような状況は、Queueを使用して解決できます。最も簡単な解決策は、無制限のブロッキングキュー(そのような場合にはLinkedTransferQueueが適しています)とワーカースレッドの限られたサイズのプールを持つことです。 リスナーのスレッドからのログエントリはadd()/offer()、ワーカースレッドの処理ではtake()となります。 take()は、処理に使用できるログエントリがない場合はスレッドをブロックします。

P. S.A LinkedTransferQueueは同時使用のために設計されており、外部同期は必要ありません。コンカレントDSファミリと同じように弱いイテレータに基づいています。

関連する問題