【发布时间】:2020-04-11 09:28:19
【问题描述】:
我正在开发一个客户端-服务器应用程序,我想在通过套接字接收到停止消息时关闭服务器。我的服务器的代码如下所示
public class Server extends Thread {
private AtomicBoolean running = new AtomicBoolean(true);
public synchronized void setRunning(boolean value){
running.set(value);
}
public void run(){
while(running.get()){
try {
clientSocket = serverSocket.accept();
//doing stuff...
}catch (IOException e) {
logger.error("{} \n",e.getMessage());
}
}
变量 running 设置在另一个处理我的消息的类中。函数是这样写的
public synchronized void onReceive(Message message){
if(message.equals(stopMessage)){
server.setRunning(false);
for(Client c : clients)
c.shutdown();
server.shutdown();
}
}
我的问题是服务器中的 while 循环在将运行变量设置为 false 之前再执行一次迭代,并且服务器尝试检查套接字,即使它为空,因为连接到该套接字的客户端已经关闭(客户端是也是一个线程)。我做错了什么,但我不知道是什么。有任何想法吗?谢谢!
【问题讨论】:
-
为什么
setRunning()是同步的?除了设置Atomic…之外,它什么也不做…… -
第一次尝试时我使用了一个布尔值。然后我改为 AtomicBoolean。我试过没有同步,但结果是一样的
-
accept()块。在接受下一个连接之前,您的循环不会检查布尔值。
标签: java sockets client-server atomic