Ich habe zwei Threads von einer Controller-Klasse ausgeführt. Der erste Thread empfängt SMS-Nachrichten und sollte weiter ausgeführt werden, solange das Programm im gestarteten Zustand ist. Der andere Thread wird verwendet, um den GPS-Standort der Einheiten zu berechnen.Wie (d) Methoden zu synchronisieren und Eigenschaften von Objekten in einem übergeordneten Objekt zu ändern?
Der Controller startet den SMS-Thread und wartet auf eine Textnachricht. Wenn eine Textnachricht bestimmte Kriterien erfüllt, wird der GPS-Standort-Thread gestartet und die Koordinaten werden zurück an die Steuerung gesendet.
Für jeden Thread, habe ich folgendes Format verwendet:
reader = new Reader(this);
new Thread(reader).start();
Der Leser Klasse verwendet dann eine Referenz der Steuerung, so dass es ein Verfahren, in dem Controller nennen kann:
public void ReceivedCommand(String address) {
[..]
}
Diese Methode erstellt dann eine Instanz des GPS-Threads, der selbst eine Methode aus dem übergeordneten Objekt (Thread?) Namens ReceivedLocation
aufruft, die dann die neue SMS-Nachricht (TextMessage
Objekt) einrichtet. Das Problem ist, dass der SMS-Thread nur die Adresse des ursprünglichen Absenders zurückgeben kann (um darauf zu antworten), und ich muss den GPS-Thread verwenden, damit ich die Payload für die SMS-Nachricht einstellen kann.
So jetzt habe ich 2 Methoden mit dem gleichen Objekt (TextMessage
Objekt), aber ich möchte sicherstellen, dass die erste Methode (SMS-Adresse Setter) die Adresse nicht ändert, während der GPS-Thread die GPSLocation zu setzen bekommt.
kann ein Block innerhalb ReceivedCommand()
Synchronisierung:
- die Adresse zum Objekt
TextMessage
hinzufügen, - den Faden GPS Lauf
- Lassen Sie das GPS-Thread die zweite Methode aufrufen (
ReceivedLocation()
) - Und Lassen Sie diese Methode das TextMessage-Objekt ändern?
ich meine Antwort über 50 bearbeitet haben jetzt mal - wahrscheinlich einen weiteren gelesen Wert. Beachten Sie, dass das Synchronisieren der Methoden Ihres 'TextMessage'-Objekts nicht immer ausreicht - es können * atomare * Operationen vorhanden sein, die Sie steuern möchten (d. H. Ein' compareAndSet') –