Ich entwickle eine Android-Anwendung und in der Anwendung, die ich eine Menge Hintergrundaufgaben durchführen. Die Anforderung besteht darin, dass alle Anforderungen seriell verarbeitet und parallel ausgeführt werden können. Beispiel: Angenommen, ich bekomme Aufgabenanforderungen nacheinander. Um diese Aufgaben hinzuzufügen, führe ich eine Anforderungswarteschlange. Nehmen wir an, die aktuelle WarteschlangenstatusAndroid Multithreading Job Executor basierend auf der Warteschlange Inhalt
(Leiter) Task1 ist -> Task2 - Task3 - Task4 -Task5 - Task6 (Schwanz)
ich einen Thread-Pool habe, die die Aufgaben parallel ausführt. Der Executor wählt immer die Aufgabe am Kopf und übergibt die Ausführung an den Thread-Pool. In meiner Anforderung muss ich manchmal die Aufgaben aus der Warteschlange entfernen, die nicht mehr benötigt werden. Und das Design ist so, dass alte Aufgaben entfernt werden, die nicht mehr benötigt werden. Angenommen, Task1 und Task2 werden vom Threadpool ausgeführt, während verbleibende Aufgaben in der Warteschlange warten. Die aktuelle Warteschlange Zustand ist
(Leiter) Task3 - Task4 -Task5 - Task6 (Schwanz)
einen Anruf Angenommen wird, um alte Aufgaben zu entfernen d.h Task3 und Task4. Diese Aufgaben sollten entfernt werden und Task4 wird als nächste Aufgabe für den Thread-Pool übergeben.
Was ich brauche: ich einen Job Manager benötigen, um diese Operationen wie 1. Überprüfen Sie für Anforderungswarteschlange kontinuierlich und Versand Aufgaben zu verwalten Pool einzufädeln 2. Jedes Mal, wenn removeTask genannt wird, Aufgaben entfernen und dann Versand von Ereignissen weiter aus die Warteschlange, bis die Warteschlange leer wird 3. Wenn die Warteschlange leer wird, muss der Thread warten/schlafen, bis die nächste Anfrage in die Warteschlange kommt. 4. Der Job-Manager sollte Tasks in der Warteschlange überwachen und auswählen und im Executor-Service ausführen, in den Wartestatus oder Ruhezustand wechseln, wenn die Warteschlange leer ist, und zur Ausführung von Tasks wechseln, wenn sich Elemente in der Warteschlange befinden und fortfahren. 5 . (Wichtig) Ich möchte, dass Benutzeroberflächen-Threads beim Zugriff auf die Anforderungswarteschlange bevorzugt werden.
Was ich: 1. Eine atomare Referenz der Anfrage durch UI-Thread und Job Manager (ein anderer Hintergrund-Thread) 2. Bereit Aufgaben gemeinsam genutzte Warteschlange
Ich dachte an
while(true) {
//check for any items in the queue and execute
}
mit in Job Manager run() Methode, aber das verbraucht unnötig CPU, wenn die Warteschlange leer ist
Bitte geben Sie mir Logik für JobManager.
Auch noch eine Frage. Stellt das Erstellen der atomaren Referenz der Anforderungswarteschlange die Thread-Sicherheit sicher? oder sollte ich die Anfrage-Warteschlange Variable synchronisiert?
macht nicht einfach 'HandlerThread' was du willst? – pskink
Bitte überprüfen Sie Bandmuster, http://square.github.io/tape/ – deadfish