【发布时间】:2016-09-13 11:22:34
【问题描述】:
我正在使用给定的 client.jar 编写聊天室应用程序。我的主要工作是编写服务器。然后我可以在命令窗口中运行 server.jar,如果我想设置第二个服务器,我将打开另一个命令窗口并再次运行 server.jar。这是我的简短代码:
public class Server {
public static void main(String args[]) {
/*Read the parameter,such as IP address and port from config file
Each line in the file represents a server*/
// Code: Get the parameter for setting serverSocket...
/*Here I want to use a ServerInfo class to store
name of all the activated server, it has an attribute
'ArrayList<String> list', every time before set
up the server, firstly add server name to the list*/
ServerInfo.getInstance().list.add(server name);
try {
// set up the serversocket
while(true) {
// listening to the client
}
} catch {
// other codes
}
}
}
对于ServerInfo类,我使用单例来获取它的实例,这样每次我都可以将服务器名添加到相同的ArrayList
问题来了。在我第一次运行 server.jar 后,我可以成功地将名称添加到列表中,但是,当我再次运行 server.jar 以设置另一个服务器时,方法 getInstance() 不起作用,它似乎是一个新的创建ServerInfo 类的实例,并将第二个服务器名称添加到此新实例的Arraylist。所以我不能将所有名称都添加到同一实例的ArrayList 中。
无论如何要处理这个问题?
【问题讨论】:
-
并发、信号量、同步...这些是您搜索的标签
-
您启动了另一个 JVM 进程,但您对列表中没有预先填充第一个 JVM 进程中的对象感到惊讶?这是对您问题的公平总结吗?
-
“无论如何要处理这个问题?”只需按照要求执行:“/*从配置文件中读取参数,例如 IP 地址和端口 文件中的每一行代表一个服务器 */” - 您可以在一次调用该程序。剧透:使用循环。
-
@MarkoTopolnik 是的,你的总结完全正确,抱歉我是java新手,不能很好地总结问题
-
那么答案很明显:线程都存在于 same JVM 进程中。您不能运行
server.jar两次并在它们之间共享对象。
标签: java concurrency synchronization