【发布时间】:2012-06-12 13:01:23
【问题描述】:
我有两个 while 条件,一个在另一个里面,用布尔值来控制它们。基本上,一个用于终止共享,另一个用于侦听连接。用户可以选择禁用共享,在这种情况下,服务器会停止侦听,但不会终止。如果用户选择终止,则两个布尔值都设置为 false 并且循环结束。
这是我的代码:
public void run() {
while (!terminate) {
while (listening) {
try {
// accept connection -> create a new thread for each client
ClientServerShareInstance clientServerShareInstance = new ClientServerShareInstance(serverSocket.accept(), ui);
Thread clientServerThread = new Thread(clientServerShareInstance);
clientSockets.add(clientServerShareInstance);
connectedClients++;
clientServerThread.start();
} catch (IOException ex) {
}
}
}
}
public void closeAllClientConnections() {
for (Iterator it = clientSockets.iterator(); it.hasNext();) {
ClientServerShareInstance clientServerShareInstance = (ClientServerShareInstance) it.next();
clientServerShareInstance.closeAllConnections();
it.remove();
}
try {
this.serverSocket.close();
} catch (IOException ex) {}
this.setActive(false);
this.connectedClients = 0;
}
public void openConnection() {
try {
serverSocket = new ServerSocket(portNumber, 0, Inet4Address.getLocalHost());
setActive(true);
} catch (IOException ex) {}
}
}
closeAllClientConnections() 方法禁用共享(不会终止它),openConnection() 重新启用该共享。
问题是,如果我禁用共享,它应该只是无限期地循环terminate while cicle,测试listening 的值。当我将listening设置为true时,它应该重新进入第二个while循环并再次开始监听,因为我确实打开了服务器套接字(虽然它与此无关,但我只是说它必须被初始化再次因为我在禁用共享时关闭它)。但是,禁用后,它永远不会租用 listening 循环,即使在调用 openConnection() 时也是如此。
有人知道这里有什么问题吗?
【问题讨论】:
-
setActive(...)设置listening的值? -
不,它们只是在我的班级中被声明为常规私有布尔值。我没有使用 volatile,因为我认为对象是在多个线程之间共享的,并且我不需要锁,因为它不是一个复杂的操作,多个线程同时“争夺”访问权限。
-
@Gray 是的,确实如此。它只是该变量的设置器。
-
我已将我的 cmets 移至答案。
-
如何正确格式化您的代码...
标签: java multithreading sockets loops while-loop