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

NAM :

I have a list of the socket in the main function, add a new socket when a new client connects to the server.

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

    }
}

Besides that, I also want to create a new thread that will synchronize the list of this socket to the client (by sending the list to clients periodically).

public class SyncThread extends Thread{
    private static List<MySocket> sockets;

    @Override
    public void run(){
        //send list sockets to client
    }
}

How to I synchronize the list of the socket between the main function and SyncThread?

Andy Turner :

Make your list a synchronized list:

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

And then pass this as a constructor parameter to 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;
    }
    ...
}

Bear in mind that this doesn't make sockets synchronized for compound operations, e.g. iteration. For that, you'd need to explicitly synchronize on sockets; or choose a different type of list such as CopyOnWriteArrayList, which is inherently thread-safe (the choice depends on the read/write characteristics of how you use the list).

Additionally, it's rarely appropriate to extend Thread directly. Instead, pass it a Runnable:

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

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=194724&siteId=1