3

スレッドのキューの制御に問題があります。私のアプリケーションは、MySQL データベースを使用してデータの一部を読み取り、処理して画面に結果を表示します。キューには約 20 のタスクがありますが、一度に処理されているのは 1 つだけです。また、ユーザーは現在のキューをキャンセルし、データベースからデータの別の部分を「要求」する場合があります。現在、「最も古いポリシーを破棄する」で ThreadPoolExecutor を使用しています。これは、データの「最も古い」部分をキューから削除し、ユーザーが必要なときに「新しい」部分に置き換えるためです。私の問題は、corePoolSize が 1 に設定されていても、一度に 4 つのスレッドが実行される場合があることです。開始されていないタスクのキューをきれいに空にする方法がわかりません。今、私は getQueue() を使用してリストからすべての項目を削除していますが、それは悪い方法だと読みました。

結論:
1. ThreadPoolExecutor に一度に 1 つのタスクだけを強制的に実行させる方法はありますか?
2. タスクの重複を防ぐためにキューをチェックする方法 (文字列値で区別されます)?
3. キューから「古い」タスクをきれいに削除するには?

それとも、他のメカニズムを使用する必要がありますか?

どんな助けでも大歓迎です。

4

2 に答える 2

2
1. Is there any way to force ThreadPoolExecutor to run just 1 task at once?

Executors.newSingleThreadExecutor()

2. How to check queue to prevent duplicates of tasks (they are distinguished by String 

タスク名の独自のリストを作成します。タスクをエグゼキュータに送信する前にこのリストにタスク名を追加し、タスクの実行後にタスク名を削除します。

3. How to remove cleanly 'old' tasks from queue?

タスクをエグゼキュータに追加すると、Future オブジェクトが取得されます。future を使用してタスクをキャンセルできます。または、エグゼキュータをシャットダウンして新しいものを作成することもできます)

于 2013-01-07T18:45:55.977 に答える
1

おそらく、 を使用Executors.newSingleThreadExecutor()すると、プールにスレッドが 1 つだけ存在することをより確実に保証できます。

于 2013-01-07T18:21:11.500 に答える