【问题标题】:Breaking out of a loop from different class打破来自不同班级的循环
【发布时间】:2013-06-14 02:53:13
【问题描述】:

所以,这就是我所拥有的。这是一个使用线程连接到多个客户端的服务器程序。到目前为止,该主循环几乎是无限的。 假设客户端向 ServerThread 发送了关闭命令。那个 ServerThread 是否能够访问主类,跳出循环,到达程序的末尾?

我尝试在 ServerThread 中设置 isRunning = false,但这似乎不起作用。

public class Server
{
    public static boolean isRunning = true; 

    public static void main(String[] args)
    {
        // init stuff

        try {
            serverSocket = new ServerSocket(27647);
        } catch (IOException e) {
            println("Could not listen on port 27647");
        }

        while(isRunning)
        {  
            Socket clientSocket = null;

            try{
                clientSocket = serverSocket.accept();
            } catch(IOException e) {
                println("Could not connect to client"); 
            }

            ServerThread serv = new ServerThread(clientSocket);
            serv.start();
        }

        try {
            serverSocket.close();
        } catch (IOException e1) { }
    }
}

【问题讨论】:

  • 显示你在ServerThread中放置isRunning = false的代码

标签: java multithreading loops


【解决方案1】:

您需要使 isRunning 变为 volatile,并且您必须关闭 serverSocket 才能解除对接受线程的阻塞。我建议你有一个类似的方法

public void close() throws IOException {
    isRunning = false;
    serverSocket.close();
}

如果您从任何线程调用它,该线程几乎会立即停止。

【讨论】:

  • volatile 确保三件事 1) 编译器不会优化读取和写入 2) CPU 不仅会访问它自己在缓存中的副本 3) 定义了发生之前和之后的关系。即,您在 volatile 写入之前所做的任何更新都是可见的,并且您在 volatile 读取之后所做的任何读取都将看到之前完成的任何写入。
猜你喜欢
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
  • 2012-02-14
  • 2017-06-20
  • 1970-01-01
相关资源
最近更新 更多