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

How to synchronize a variable in main function to new thread?

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

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
    }
}

如何在main函数和SyncThread之间同步socket列表?

将您的列表设为同步列表:

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,它本质上是线程安全的(选择取决于您如何使用列表的 read/write 特性)。

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

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