Java停止服务器线程

9
以下代码是我的应用程序中的服务器端代码:
private int serverPort;

private Thread serverThread = null;

public void networkListen(int port){

    serverPort = port;

    if (serverThread == null){
        Runnable serverRunnable = new ServerRunnable();
        serverThread = new Thread(serverRunnable);
        serverThread.start();
    } else {

    }
}

public class ServerRunnable implements Runnable {

    public void run(){

        try {

            //networkConnected = false;
            //netMessage = "Listening for Connection";
            //networkMessage = new NetworkMessage(networkConnected, netMessage);
            //setChanged();
            //notifyObservers(networkMessage);

            ServerSocket serverSocket = new ServerSocket(serverPort, backlog);

            commSocket = serverSocket.accept();

            serverSocket.close();
            serverSocket = null;

            //networkConnected = true;
            //netMessage = "Connected: " + commSocket.getInetAddress().getHostAddress() + ":" +
                    //commSocket.getPort();
            //networkMessage = new NetworkMessage(networkConnected, netMessage);
            //setChanged();
            //notifyObservers(networkMessage);

        } catch (IOException e){

            //networkConnected = false;
            //netMessage = "ServerRunnable Network Unavailable";
            //System.out.println(e.getMessage());
            //networkMessage = new NetworkMessage(networkConnected, netMessage);
            //setChanged();
            //notifyObservers(networkMessage);
        }
    }
}

这段代码有点可用,即如果我尝试建立一个直接连接,则两端可以通信和更新。

问题在于,当我正在等待连接时,如果我想要停止等待,则服务器线程继续运行并引起问题。

我知道不应该在线程上使用 .stop(),所以我想知道考虑到这一点解决方案会是什么样子?

编辑:注释掉了不需要的代码。

2个回答

13

关闭来自外部线程的服务器套接字。根据Serversocket.close()文档,阻塞式accept将抛出SocketException异常,您可以关闭线程。


8

在初始化ServerSocket之后,使用setSoTimeout。将accept放在一个循环中,并捕获超时。根据您是否想继续,从循环中退出并从run返回。


非常感谢你提供的“中断循环”的技巧-它是关键! - Kirzilla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接