2016-03-30 11 views
0

Ich habe eine App, wo nach Drücken einer Start-Taste ein Service beginnt, der einige Sensoren abfragt, die Sensordaten in einem Objekt speichert, sobald sich die Sensorwerte ändern. Alle 10ms tritt eine Datenbankeinfügung auf, die die aktuellen Werte der Objekte übernimmt und in der Datenbank speichert. Dies passiert für 30 MinutenAndroid: blockierende oder nicht blockierende Warteschlange für fortlaufende SQL-Einsätze?

Angesichts der Geschwindigkeit und Dauer der Einfügung, möchte ich dies in einem separaten Thread aus dem UI-Thread ausführen, so dass die Navigation keinen Treffer bekommt. Also wird mein Dienst dem Thread einige Daten anbieten, indem er sie zu einer Warteschlange hinzufügt, dann wird der andere Thread (Verbraucher) aus der Warteschlange nehmen und in die Datenbank einfügen

Wenn die Stop-Taste gedrückt wird, muss ich sicherstellen um den Rest der Warteschlange zu bearbeiten, bevor der Thread beendet wird.

Es scheint, dass überall, wo ich suchen, Warteschlange eine Art Blockierung für Erzeuger/Verbraucher-Typ Situationen empfohlen wird (z LinkedBlockingQueue vs ConcurrentLinkedQueue oder What's the different between LinkedBlockingQueue and ConcurrentLinkedQueue?)

Meine Frage ist, ob eine sinnvoll Sperr Warteschlange in meiner Situation?

Die meisten wichtige Sache in dieser App ist, dass alle Daten in die db eingefügt wird. Nach dem, was ich verstehe (bitte korrigieren Sie mich, wenn ich falsch liege), aber wenn die Warteschlange voll wird und der Consumer - Thread keine Einfügungen schnell genug ausführen kann, um mehr Platz in der Warteschlange freizugeben, wird der Produzent daran gehindert, Dinge hinzuzufügen Warteschlange? Wenn das richtig ist, dann durch die Zeit Queue die freien Platz hat, wären ein paar Sensor Lesungen gegangen und sie würden nicht in die db wegen der Blockierung eingefügt werden

Am Ende des Tages, ich brauche nur das Beste So stellen Sie sicher, dass Daten alle 10 ms ohne Überspringen eingefügt werden. Meiner Meinung nach ist es sinnvoll, die Werte alle 10ms in eine unbegrenzte, unbegrenzte Warteschlange zu stellen und sie so bald wie möglich vom Kunden abfragen zu lassen. Wenn Stop gedrückt wird, entleeren Sie den Rest der Warteschlange, bevor Sie den Thread löschen.

Also, was ist der richtige Weg, dies in einer 1 Produzent/1 Verbraucher Situationen zu behandeln?

Antwort

0

Wenn ich Sie wäre, würde ich einen einzigen Thread-Executor für diese Aufgabe verwenden - es kommt bereits mit der genauen Funktionalität, die Sie aus der Box benötigen. Weitere Informationen here.

Verwandte Themen