L'utilisation de synchronized dans une application multi-thread
Salut ici,
Je vous explique mon problème :
J'ai un jeu multijoueur qui utilise une application java comme serveur. Donc, à chaque fois qu'un joueur se connecte, un nouveau thread est créé.
Le problème, c'est que quand j'arrive vers 30-40 joueurs, de temps en temps le serveur n'envoie plus rien à personne pendant environs 10 secondes. Des gros coup de lag en gros ^^
Ca c'est quand je n'utilise pas le mot clef "synchronized".
Le problème, c'est quand je met synchronized devant toutes mes méthodes le serveur plante (sans message d'erreur) ou bout de 4-5 joueurs.
C'est un petit jeu de plateforme multijoueur en temps réel que vous pouvez trouvez ici : http://www.extinction.fr/aaaaah/. C'est assez dynamique et le serveur reçoit pas mal d'informations par secondes.
Je n'arrive pas à trouver où ça coince car le serveur ne m'envoie pas de message d'erreur.
J'ai l'impression que ça vas pas lorsque le serveur doit redistribuer un message à plusieurs client. Il procède de cette façon :
Cette méthode se trouve dans la classe principale, LS_JOUEUR correspondant à un ArrayList contenant le thread de chaque joueur. Cet objet est le seul que les threads se "partage".
Code:
1 2 3 4 5 6 7
|
public void Envoie(ArrayList<Joueur> LS_JOUEUR, String MESSAGE) {
int NbJoueur = LS_JOUEUR.size();
for (int i = 0; i < NbJoueur; i++) {
LS_JOUEUR.get(i).Envoie(MESSAGE);
}
} |
Dans le thread de chaque joueur se trouve cette méthode, qui est appelée plus haut :
Code:
1 2 3 4 5
|
public void Envoie(String MESSAGE) {
Socket_Out.print(MESSAGE + '\u0000');
Socket_Out.flush();
} |
Si quelqu'un peut m'indiquer comment placer mes mot clef synchronized, ça m'intéresse :)