2013-05-04 61 views
1

目前我正在开发Java客户端/服务器聊天应用程序,并且遇到了一个问题,我会尽可能地解释清楚。如何从某个Java线程调用方法

我的服务器部分保持创建线程(new ServerThread)对谁联机每个用户:

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 
} 

我有一个ServerThread类getter方法,我想从某些ServerThread调用基于套接字的实例。但ServerThread类没有分配给任何变量,所以我不知道如何从它调用方法。任何解决方案?很容易,你需要找到并找到你想强制的方法调用一个方法,你会保持你创建的每个线程,我建议你用于保持客户端的地图将在< ServerThread,DataOutputStream>

+0

如果您需要在所有服务器线程上调用它,我建议您构建它们的列表并在需要时迭代它。如果您需要在特定情况下在特定线程上调用它,则需要有关您的方案的更多信息。 – Medo42 2013-05-04 21:24:12

+2

你的问题不清楚。你的'ServerThread'有一个'run()'方法,在这个方法中执行流程。如果你想从线程调用“from”,你可以从那里调用一个方法。 – 2013-05-04 21:24:29

+7

为什么在创建它之后不存储对每个ServerThread的引用。将其插入到以套接字为关键字的静态哈希映射中。 – 2013-05-04 21:29:09

回答

1

,所以现在你有了所有的线程(和ServerThread中的Scoket实例),好的和答案。

好首先你需要在ServerThread信令目标线程的方法,这样

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

话,那么谁去调用这个方法?简单地创建一个类,会调用目标客户端的同步或异步模式,就这样

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 
    } 
} 

,并在结束时,每当你想在客户端运行特定的方法,只要找到客户端后(ServerThread)例如,通过ClientMethodCaller

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

和一锤定音调用目标方法,这是不好的,正在运行的线程的任何客户端登录,如果程序是不小,而且用户的数量是多少。 也检查this tutorial也将帮助

相关问题