8

重複の可能性:
Javaエグゼキュータ:タスクの優先度を設定するにはどうすればよいですか?

LinkedBlockingDequeueを使用して構築されたThreadPoolExecutorがあり、基になるキューを操作したいのですが、ドキュメントでこれを読むと非常に緊張します。

キューのメンテナンス

getQueue()メソッドを使用すると、監視とデバッグを目的としたワークキューへのアクセスが可能になります。この方法を他の目的に使用することは強くお勧めしません。提供されている2つのメソッド、remove(java.lang.Runnable)とpurge()を使用して、キューに入れられた多数のタスクがキャンセルされた場合のストレージの再利用を支援します。

具体的にはできるようになりたい

  1. キューをチェックして、要素がすでに存在するかどうかを確認します。キュー内の要素を表示するだけでロックは必要ないため、これで問題ないと思います。
  2. 何らかの信号に基づいてキューを並べ替えたい。これは明らかに面倒な場合があります。他の用途のためにキューを台無しにしないために、これを行うための好ましい方法があるかどうか疑問に思いました。

ありがとう

4

1 に答える 1

4

getQueue()BlockingQueue<Runnable>に渡した正確な値を常に返しますThreadPoolExecutor

ドキュメントの心配は、のスレッドセーフを保証できない場合、ダブルランニングの問題に簡単に遭遇する可能性があることBlockingQueueです。を使用し、 and (またはより直接的には)PriorityBlockingQueueのみを使用する場合は、安全であり、から直接実行することもできます。removeaddoffergetQueue()

つまり、シグナルが一部Runnableの優先度が変更されたことを通知する場合は常に、それを実行removeして削除の結果を確認し(true削除された場合)、実際に削除された場合にのみ、再度追加する必要があります。これらの操作の間に何かがピックアップされないという保証はありませんが、少なくとも、 -> ->Runnableを使用すると簡単に発生する可能性がある、を二重に実行しないことが保証されます。containsremoveadd

それか、新しいデータを要求されるたびに最高の優先順位を見つける(のような)BlockingQueueを使用する独自の実装を作成できます。さまざまなインターフェースが関係していることを考えると、これはもっと多くの作業のように思えます。ComparatorPriorityBlockingQueue

于 2012-09-20T18:33:21.887 に答える