私はアンドロイドアプリケーションを開発しており、アプリケーションでは多くのバックグラウンドタスクを実行しています。要件は、すべての要求を順次処理し、並列に実行する必要があることです。 例:タスク要求を次々と受け取っていると仮定します。これらのタスクを追加するために、私は要求キューを維持しています。のは、現在のキューの状態があるとしましょうキューの内容に基づいてAndroidのマルチスレッドジョブエグゼキュータ
(ヘッド)タスク1 - > Task2の - タスク3 - Task4 -Task5 - Task6(テール)
私は並行してタスクを実行するスレッドプールを持っています。 Executorは常に先頭のタスクを選択し、実行するスレッドプールに送信します。 私の要求では、時には、キューからタスクを削除する必要があります。そして、もはや必要とされない古いタスクが削除されるような設計です。残っているタスクがキューで待機している間に、Task1とTask2がスレッドプールによって実行されているとします。現在のキューの状態が
である(ヘッド)タスク3 - Task4 -Task5 - Task6(テール)
コールを想定タスク3とTask4すなわち、古いタスクを削除するために作られています。これらのタスクは削除し、Task4はスレッドプールの次のタスクとして送信されます。私は必要なもの
: 私はremoveTaskが呼び出されるたびに、タスクを削除してからイベントの派遣を継続プール 2.スレッドする 1.継続的に要求キューの確認・発送作業のように、これらの操作を管理するジョブマネージャを必要としますキューが空になるまでのキュー 3.キューが空になると、スレッドは次の要求がキューに入るまで待機/スリープする必要があります。 4.ジョブマネージャはキュー内のタスクを監視して実行し、エグゼキュータサービスで実行する必要があります。キューが空の場合は待ち状態またはスリープ状態になり、キュー内に項目がある場合はタスクを実行して続行します。 5 (重要)UIスレッドにアクセス要求キューを優先させたい。
私が持っているもの: 1.私は
while(true) {
//check for any items in the queue and execute
}
を使用して考え
UIスレッドとジョブマネージャ(別のbackroundのスレッド) 2.レディタスクが共有する要求キューのアトミック参照ジョブマネージャのrun()メソッドを使用していますが、キューが空の場合にCPUを不必要に消費します。
jobManagerのロジックを入力してください。
もう1つ質問します。要求キューのアトミックな参照を作成すると、スレッドの安全性が保証されますか?または要求キューの変数を同期させる必要がありますか?
単純な 'HandlerThread'はあなたが望むものを作っていませんか? – pskink
テープパターンをチェックしてください。http://square.github.io/tape/ – deadfish