2010-03-13 9 views
3

j'ai besoin d'aide pour composer avec trois fils dans le fil AndroidDiscussion aide avec Android jeu

One est le fil conducteur, l'autre est le GLTHREAD, et l'autre est un WorkerThread j'ai créé pour mettre à jour l'état du jeu.

Le problème que j'ai est qu'ils ont tous besoin d'accéder à la même LinkedList d'objets de jeu. Le GLThread et mon WorkerThread ne lisent que depuis LinkedList, donc pas de problème, mais de temps en temps j'ai le thread principal qui ajoute un autre objet de jeu à la liste.

Comment puis-je gérer cela? J'ai essayé d'utiliser synchronisé devant les fonctions impliquées mais cela ralentit vraiment l'application. Pour une raison quelconque, le simple fait d'intercepter les erreurs et de ne pas restituer ou mettre à jour l'état de jeu de cette image entraîne son retard permanent.

Quelqu'un a des idées géniales?

Répondre

1

Je suggère un CopyOnWriteArrayList. Cela copie la liste de sauvegarde quand il mute, mais permet une lecture non synchronisée avec le compromis que vous lisez la liste à partir d'un instant en ce qui concerne les écritures.

0

Il existe plusieurs façons de le faire: si votre liste n'est pas trop grande, vous pouvez utiliser CAS (comparer et définir) la liste qui est une opération atomique. Cela nécessite que vous créez une copie de la liste, ajouter l'élément qui doit être ajouté et ensuite CAS sans verrouillage. Si l'ajout ne se produit qu'occasionnellement, il ne s'agira pas d'un surcoût significatif. CAS est une méthode sur un AtomicReference de Java atomic library ... comme Software Singe mentionné la même chose peut être atteint avec le CopyOnWriteArrayList.

Alternativement, vous pouvez également jeter un oeil aux différents conteneurs dans Java concurrency library, ou si vous voulez avoir une collection sans verrou, puis utiliser le ConcurrentHashMap.