我有一个问题要问你。 我有一个名为ServerThread的类的多个Threads运行。当任何一个线程发生特定事件时,我想调用并行运行的每个其他线程的方法。
public class ServerThread implements Runnable {
private TCPsocket clientSocket;
public ServerThread(Socket comSocket){
clientSocket = new TCPsocket(comSocket);
}
@Override
public void run(){
boolean waiting = true;
Message msg;
try{
while(waiting){
msg = clientSocket.getMessage();
shareMessage(msg);
}
}catch(Exception e){
ErrorLogger.toFile("EndConnection", e.toString());
}
}
public void shareMessage(Message msg){
clientSocket.sendMessage(msg);
}
}
我在谈论这条具体的路线
shareMessage(MSG);
我希望在每个线程/实例上调用
- 以便将消息发送到每个客户端(在所有tcp连接中)
我尝试过使用synchronized,但要么我使用得不好,要么就是我不想要的。
可能有用的另一件事是保持一个带有静态成员的类,这是一个tcpconnection对象的列表,然后每次都进行一些循环。
感谢您的帮助和时间。
使用一种可能的解决方案进行编辑
*添加静态数组作为类的成员并添加/删除相同类的对象(或者tcp套接字也可以工作)
private static ArrayList<ServerThread> handler;
...
handler.add(this);
...
handler.remove(this); //when client exists and thread stops
*然后创建一个迭代每个连接的方法,并使其同步,以便两个线程不会同时进行交互。您可能还希望在消息发送方法上实现synchronized。
public void shareMessage(Message msg){
//this.clientSocket.sendMessage(msg);
synchronized (handler){
for(ServerThread connection: handler){
try{
connection.clientSocket.sendMessage(msg);
} catch(Exception e){
connection.clientSocket.closeConnection();
}
}
}
}
答案 0 :(得分:0)
首先:当多个线程想要调用相同的方法并且此方法访问/修改共享数据时,需要synchronized
来防止竞争条件。所以也许(可能)你需要它,但它不能为你提供所需的功能。
第二:你不能命令其他线程直接调用方法。例如,这是不可能的。让ThreadA
在methodX
中拨打ThreadB
。
我猜你每个客户端都有一个线程。可能每个线程都会在clientSocket.getMessage()
处阻塞,直到客户端发送消息。我不知道TCPsocket
的实现,但也许有可能interrupt线程。在这种情况下,您可能需要捕获InterruptedException
并询问某些中央数据结构,如果由于新的共享消息而导致中断并返回共享消息。
如果在一段时间内没有收到任何消息,也许TCPsocket.getMessage()
也可能返回,在这种情况下,如果有新的共享消息,您将再次询问中央数据结构。
也许也可以将所有客户端连接存储在这样的数据结构中,并按照您的建议每次循环它们。但请记住,客户端可能随时发送消息,甚至可能在您尝试向其发送从其他客户端收到的共享消息的同一时间发送消息。这可能没问题,但这取决于您的应用程序。此外,您还必须考虑该消息也将与首先将其发送到您的服务器的客户端共享...
另外看一下java.util.concurrent
及其子包,你可能会在那里找到有用的东西......; - )
总结:有很多可能性。哪一个最好取决于你需要什么。如果您需要更具体的帮助,请在您的问题中添加更多详细信息。