1

だから、これは私が持っているものです。これは、スレッドを使用して複数のクライアントに接続するサーバー プログラムです。今のところ、そのメイン ループはほとんど無限です。クライアントがシャットダウン コマンドを 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) { }
    }
}
4

1 に答える 1

5

isRunning を volatile にする必要があり、serverSocket を閉じて受け入れスレッドのブロックを解除する必要があります。次のような方法があることをお勧めします

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

これを任意のスレッドから呼び出すと、スレッドはほぼ即座に停止します。

于 2013-06-18T02:21:08.597 に答える