调用所有并行 Class 线程的方法

Call a method of all parallel Class Threads

我有一个问题要问你。 我有一个名为 ServerThread 的 class 的多个线程 运行。当这些线程中的任何一个发生特定事件时,我想并行调用每个其他线程的方法 运行。

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(消息);

我希望每个 thread/instance

-- 以便向每个客户端发送一条消息(在所有 tcp 连接中)

我已经尝试过同步,但要么我没有很好地使用它,要么这不是我想要的。

另一件可能有用的事情是将 class 与一个静态成员保持在一起,该静态成员是那些 tcpconnection 对象的列表,然后每次都做一些循环。

感谢您的帮助和时间。


编辑了一种可能的解决方案

*添加一个静态数组作为相同 class 的 class 和 add/remove 对象的成员(或者 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来防止多个线程要调用同一个方法时的竞争条件,并且这个方法accesses/modifies共享数据。所以也许(可能)你会在某个地方需要它,但它不提供你需要的功能。

第二:不能命令其他线程直接调用方法。这是不可能的,例如ThreadAThreadB.

中调用 methodX

我想每个客户一个线程。可能每个线程都会阻塞在 clientSocket.getMessage(),直到客户端发送消息。我不知道 TCPsocket 的实现,但也许可以 interrupt the thread. In this case you may need to catch a InterruptedException 询问一些中央数据结构是否中断是由于新的共享消息引起的,并且 return 共享的留言。

也许 TCPsocket.getMessage() 到 return 也是可能的,如果有一段时间没有收到消息,在这种情况下你将不得不再次询问中央数据结构是否有新的分享消息。

也许也可以像你建议的那样,把所有的客户端连接存储在这样一个数据结构中,每次都循环。但请记住,客户端可能会随时发送消息,甚至可能在您尝试向它发送从另一个客户端接收到的共享消息时的同一时间。这可能没问题,但这取决于您的应用程序。此外,您还必须考虑到该消息还将与首先将其发送到您的服务器的客户端共享……

同时查看 java.util.concurrent 及其子包,您可能会在那里找到有用的东西……;-)


总结一下:有很多可能性。哪一个是最好的取决于你需要什么。如果您需要更具体的帮助,请在您的问题中添加更多细节。