如何将主函数中的变量同步到新线程



我在主函数中有一个套接字列表,当新客户端连接到服务器时,添加一个新套接字。

public static void main(String[] args) throws Exception {
// TODO code application logic here
server = new ServerSocket(port);
List<MySocket> sockets = new ArrayList<>();
//this is thread responsible to synchronizing
new SyncThread().start();
while(true){
Socket socket = server.accept();
MySocket mySocket = new MySocket(socket);
sockets.add(mySocket);
SocketThread.setSockets(sockets);
new SocketThread(mySocket).start();
}
}

除此之外,我还想创建一个新线程,将这个套接字的列表同步到客户端(通过定期向客户端发送列表(。

public class SyncThread extends Thread{
private static List<MySocket> sockets;
@Override
public void run(){
//send list sockets to client
}
}

如何同步主函数和SyncThread之间的套接字列表?

使您的列表成为同步列表:

List<MySocket> sockets = Collections.synchronizedList(new ArrayList<>());

然后将其作为构造函数参数传递给SyncThread:

new SyncThread(sockets).start();  // Need to add constructor parameter to class.
public class SyncThread extends Thread{
private final List<MySocket> sockets;  // NOT static.
public SyncThread(List<MySocket> sockets) {
this.sockets = sockets;
}
...
}

请记住,这不会使sockets同步用于复合操作,例如迭代。为此,您需要在sockets上显式同步;或者选择不同类型的列表,如CopyOnWriteArrayList,它本质上是线程安全的(选择取决于如何使用该列表的读/写特性(。

此外,直接扩展Thread很少是合适的。相反,传递一个Runnable:

new Thread(() -> { /* send list sockets to client */ }).start();

最新更新