Java停止服务器线程

时间:2010-05-10 17:17:34

标签: java multithreading

以下代码是我的应用中的服务器代码:

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 个答案:

答案 0 :(得分:12)

从外部线程关闭服务器套接字。根据{{​​3}}上的文档,阻塞接受将抛出SocketException,您可以关闭线程。

答案 1 :(得分:6)

初始化ServerSocket后,使用setSoTimeout。将accept置于循环中,捕获超时。根据您是否要继续,从循环中断并从run返回。