1

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?

+0

macht nicht einfach 'HandlerThread' was du willst? – pskink

+0

Bitte überprüfen Sie Bandmuster, http://square.github.io/tape/ – deadfish

Antwort

0

Bitte geben Sie mir Logik für JobManager.

Sie müssen dies nicht von Grund auf neu implementieren. Verwenden Sie stattdessen einfach die API ExecutorService.

Von dem, was ich sagen kann, alles, was Sie zu tun versuchen, kann mit dieser API erreicht werden. Sogar die Anforderung, dem UI-Thread einen Prioritätszugriff zu geben, kann gehandhabt werden; z.B. mit einem PriorityQueue.

Die Implementierung eines Job-Managers von Grund auf, um diese Anforderungen zu erfüllen, ist (ehrlich gesagt) sinnlos.

+0

Können Sie bitte einige Beispiele zur Verwendung von 'ExecutorServices' bei der Durchführung von HTTP-Anfragen angeben? Führen Sie auch einige Operationen basierend auf der HTTP-Antwort aus. –

0

Hier einige Informationen aus der Android-Dokumentation auf einem Thread-Pool und Best Practices: https://developer.android.com/training/multiple-threads/index.html

Sie liefern Beispiele dafür, wie für den Umgang mit Hintergrundoperationen einen Thread-Pool erstellen und zu verwenden.

+0

Danke @srayhunter. Ich habe bereits Thread-Pools zum Ausführen von Aufgaben nach dem Auswählen aus der Anforderungswarteschlange. Ich benötige einen benutzerdefinierten Job-Manager zur Verwaltung der Anforderungswarteschlange gemäß meiner Anforderung (d. H., Dem Benutzeroberflächenthread Priorität einzuräumen und Tasks aus der Warteschlange zu entfernen, wenn dies für die serielle Ausführung von Tasks erforderlich ist). – nithesh1990