如何将主函数中的变量同步到新线程?
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();
我在主函数中有一个套接字列表,当新客户端连接到服务器时添加一个新套接字。
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();