2013-05-04 30 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也將幫助