我有一个问题要问你。 我有一个名为 ServerThread 的类的多个线程运行。当任何这些线程上发生特定事件时,我想调用并行运行的每个其他线程的方法。
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 连接中)
我尝试过使用同步,但要么我没有很好地使用它,要么这不是我想要的。
另一件事可能有用的是保留一个带有静态成员的类,该静态成员是这些 tcpconnection 对象的列表,然后每次都进行一些循环。
感谢您的帮助和时间。
<小时/>使用一种可能的解决方案进行编辑
*添加一个静态数组作为类的成员,并添加/删除同一类的对象(或者 TCP 套接字也可以)
private static ArrayList<ServerThread> handler;
...
handler.add(this);
...
handler.remove(this); //when client exists and thread stops
*然后创建一个对每个连接进行迭代的方法,并使其同步,以便两个线程不会同时交互。您可能还想在消息发送方法上实现同步。
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();
}
}
}
}
最佳答案
首先:当多个线程想要调用同一方法并且该方法访问/修改共享数据时,需要使用synchronized
来防止竞争条件。因此,也许(可能)您会在某个地方需要它,但它无法为您提供所需的功能。
第二:你不能命令其他线程直接调用方法。这是不可能的,例如让ThreadA
调用ThreadB
中的methodX
。
我猜你每个客户端都有一个线程。可能每个线程都会阻塞在 clientSocket.getMessage()
处,直到客户端发送消息。我不知道 TCPsocket
的实现,但也许有可能 interrupt线程。在这种情况下,您可能需要捕获 InterruptedException
并询问一些中央数据结构是否由于新的共享消息而导致中断并返回共享消息。
如果一段时间内没有收到消息,TCPsocket.getMessage()
也可能返回,在这种情况下,您将再次询问中央数据结构是否有新的共享消息。
也许也可以将所有客户端连接存储在这样的数据结构中并每次循环它们,正如您所建议的那样。但请记住,客户端可能随时发送消息,甚至可能在您尝试向其发送从另一个客户端收到的共享消息的同一时间。这可能没问题,但这取决于您的应用程序。此外,您还必须考虑到该消息还将与首先将其发送到您的服务器的客户端共享......
另请查看java.util.concurrent
及其子包,您很可能会在那里找到有用的东西......;-)
总结一下:有很多可能性。哪一种最好取决于您的需要。如果您需要更具体的帮助,请为您的问题添加更多详细信息。
关于java - 调用所有并行类线程的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29581694/