2013-05-04 13 views
1

Actuellement, je travaille sur l'application Java client/serveur de chat et j'ai une question, je vais essayer d'expliquer aussi clairement que possible.Comment appeler une méthode à partir d'un certain thread Java

Ma partie serveur continue de créer des threads (new ServerThread) pour chaque utilisateur qui est en ligne:

while (isRunning) { 
    Socket socket = serverSocket.accept(); 
    DataOutputStream dout = new DataOutputStream(socket.getOutputStream()); 
    outputStreams.put(socket, dout); 
    System.out.println (outputStreams.values()); 
    new ServerThread(this, socket); 
    window.newConnectionInfo(socket);// informace 
} 

J'ai un getter dans un ServerThread classe, que je veux appeler de la certaine ServerThread instance basée sur socket. Mais la classe ServerThread n'est assignée à aucune variable, donc je ne sais pas exactement comment appeler les méthodes. Toute solution à ce sujet?

+0

Si vous avez besoin de l'appeler sur tous les threads du serveur, je vous suggère de construire une liste d'entre eux et itérer sur cela en cas de besoin. Si vous avez besoin de l'appeler sur des threads particuliers dans certaines circonstances, plus d'informations sur votre scénario sont nécessaires. – Medo42

+2

Votre question n'est pas claire. Votre 'ServerThread' a une méthode' run() ', dans laquelle le flux d'exécution se produit. Vous appelez une méthode à partir de là si vous voulez appeler "depuis" le fil. –

+7

Pourquoi ne stockez-vous pas une référence à chaque ServerThread après l'avoir créé? Insérez-le dans une carte de hachage statique avec le socket comme clé. –

Répondre

1

Facile, vous devez localiser et trouver le fil que vous voulez forcer appeler une méthode, que vous conserviez chaque thread que vous créez, je vous suggère la carte que vous utilisez pour garder les clients serait < ServerThread, DataOutputStream> , alors ici vous avez tous les threads maintenant (et Scoket instance dans le ServerThread), d'accord et la réponse.

vous devez d'abord bien une méthode pour signaler le fil cible dans le ServerThread, comme celui-ci

class ServerThread{ 
public void forceToCall(Object o){//an object argument, would be void too, or an interface 
    //do something, call someone 
    } 
} 

alors, alors qui va appeler cette méthode? il suffit de créer une classe qui appellerait la synchronisation du client cible ou en mode asynchrone, tout comme ce

class ClientMethodCaller implements Runnable{ 
    ServerThread st;Object arg 
    public ClientMethodCaller(ServerThread st,Object arg){this.st=st;this.arg=arg;} 
    public void run() { 
     st.forceToCall(arg);//signalling the client async 
    } 
} 

et à la fin, chaque fois que vous voulez un client pour exécuter une méthode spécifique, juste après avoir trouvé le client (ServerThread) par exemple, appelez la méthode cible par ClientMethodCaller

ServerThread st;//got the instance 
new Thread(new ClientMethodCaller(st,"Hello!")).start(); 

et le dernier mot, ce n'est pas bonne, l'exécution d'un thread pour toutes les connexions client, si le programme n'est pas petit et le nombre d'utilisateurs doivent beaucoup. également vérifier this tutorial aussi, aiderait

Questions connexes