0

いくつかのタスクを実行する多数のスレッドが生成されるモジュールを作成しています。全体として、スレッドプールを使用して「タスク」を作成および送信する「リゾルバー」クラスに情報を提供する「マネージャー」クラスがあります。

リゾルバーには、特定のタスクが既に生成されているかどうかを確認するために使用している無制限のキューを持つスレッドプール エグゼキューターがあります。キューにタスクのインスタンスが既にある場合は、ThreadPoolExecutor を使用してそれを削除し、新しいタスクを再度送信します。これは、新しいタスクが「マネージャー」から新しい情報をもたらすため、意図的に行われます。

ThreadPoolexecutor を使用して、タスクが既にキューにあるかどうかを確認しています。しかし、キューのパフォーマンスが心配で、キューにはタスクのインスタンスが 30000 を超える可能性があるため、ハッシュ マップの方が適していると感じています。

キューで既に生成されたタスクを見つけるための適切な戦略を選択するようにガイドしてください。

4

1 に答える 1

0

問題が発生するとは思いません (あまりにも複雑な equals の実装を実装しない限り)。プロファイラーでテストを実行し、それが実際の問題かどうかを確認することをお勧めします...

ただし、そうである場合は、BlockingQueue の独自の実装を作成できます (コンストラクター引数として ThreadPollExecutor に渡される場合があります)。このようにして、BlockingQueue (標準作業キュー用) と HashSet (高速な contains(...) テスト用) のある種のハイブリッド実装を作成できます。これらのコレクションに対するすべての操作の適切な同期について覚えておいてください。すべての操作はアトミックでなければなりません。

于 2012-05-02T12:06:16.793 に答える