2012-05-02 11 views
0

私はいくつかのタスクを実行するいくつかのスレッドが生成されるモジュールを作成しています。全体的に私は、スレッドプールを使って 'タスク'を作成して提出する 'リゾルバー'クラスに情報を提供する 'マネージャ'クラスを持っています。キューに既に生成されたタスクを見つけるための戦略

リゾルバにはスレッドプールエグゼキュータがあります。スレッドプールエグゼキュータには、perticularタスクがすでに生成されているかどうかを確認するために使用している無制限キューがあります。キューにタスクのインスタンスがすでに存在する場合は、ThreadPoolExecutorを使用してタスクのインスタンスを削除し、新しいタスクを再度サブミットします。これは、新しいタスクが 'マネージャ'から新しい情報をもたらすため、意図的に行われます。

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

キューに既に生成されたタスクを見つけるための適切な戦略を選択する方法を教えてください。

+0

タスクを見つけ出すのではなく、 'Future.cancel(false)'を使うことができます。これは、まだ開始していないタスクを停止します。 –

答えて

0

複雑すぎる実装を実装しない限り、問題は起こりそうにありません。プロファイラでテストを実行し、実際の問題であるかどうかを調べることをお勧めします。

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

+0

ありがとうございます。私はBlockingQueueと一緒に行き、その上でremoveを呼び出して保留中のタスクをすべて削除します。すべての操作がアトミックであると言うと、同期メソッドを使用してアトミックにすることをお勧めしますか?それとも他のより良い魂の魂ですか? – user832096

+0

独自の実装でクラスをカプセル化していない場合は、同期を心配する必要はありません。 – MikePatel

+0

はい、すべての方法を同期することをお勧めします。代わりに、Lock(http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/locks/Lock.html)を使用することもできます。 – altanis

関連する問題