J'ai deux threads en cours d'exécution à partir d'une classe de contrôleur. Le premier thread reçoit des messages SMS et doit continuer à s'exécuter tant que le programme est dans l'état démarré. L'autre thread est utilisé pour calculer l'emplacement GPS des unités.Comment synchroniser les méthodes (d) et modifier les propriétés des objets dans un objet parent?
Le contrôleur lance le thread SMS et attend d'un message texte. Si un message texte répond à certains critères, le fil de localisation GPS est lancé et les coordonnées sont renvoyées au contrôleur.
Pour chaque fil, je l'ai utilisé le format suivant:
reader = new Reader(this);
new Thread(reader).start();
La classe de lecteur utilise alors une référence du contrôleur afin qu'il puisse appeler une méthode dans le contrôleur:
public void ReceivedCommand(String address) {
[..]
}
Cette méthode crée ensuite une instance du thread GPS qui appelle lui-même une méthode de l'objet parent (thread?) Appelé ReceivedLocation
qui configure ensuite le nouveau message SMS (objet TextMessage
). Le problème est que le thread SMS ne peut que retourner l'adresse de l'expéditeur d'origine (pour répondre à) et j'ai besoin d'utiliser le fil GPS afin que je puisse définir la charge utile pour le message SMS. Donc maintenant j'ai 2 méthodes utilisant le même objet (TextMessage
objet), mais je veux m'assurer que la première méthode (l'adresse d'adresse SMS) ne change pas l'adresse pendant que le thread GPS obtient le GPSLocation à définir.
peut synchroniser un bloc dans ReceivedCommand()
:
- Ajouter l'adresse à l'objet
TextMessage
, - Exécutez le fil GPS
- Laissez le fil GPS appeler la deuxième méthode (
ReceivedLocation()
) - Et laissez cette méthode modifier l'objet TextMessage?
J'ai modifié ma réponse 50 fois maintenant - vaut probablement une autre lecture. Notez que la synchronisation des méthodes de votre objet 'TextMessage' n'est pas toujours suffisante - il peut y avoir des opérations * atomic * que vous voulez contrôler (c'est-à-dire' compareAndSet') –