2

ソケットを使用して Java でクライアント/サーバー アプリケーションを作成しています。サーバーには、クライアント接続を受け入れるスレッドがあり、このスレッドは無期限に実行されます。アプリケーションのある時点で、クライアント接続の受け入れを停止したいので、そのスレッドを破棄することが唯一の方法だと思います。スレッドを破棄する方法を誰か教えてもらえますか?

これが私のコードです:

class ClientConnectionThread implements Runnable {

    @Override
    public void run() {
        try {
            // Set up a server to listen at port 2901
            server = new ServerSocket(2901);

            // Keep on running and accept client connections
            while(true) {
                // Wait for a client to connect
                Socket client = server.accept();
                addClient(client.getInetAddress().getHostName(), client);

                // Start a new client reader thread for that socket
                new Thread(new ClientReaderThread(client)).start();
            }
        } catch (IOException e) {
            showError("Could not set up server on port 2901. Application will terminate now.");
            System.exit(0);
        }
    }
}

ご覧のとおり、そこに while(true) という無限ループがあるため、このスレッドは、何らかの方法で停止しない限り停止しません。

4

2 に答える 2

3

これを行う正しい方法は、サーバー ソケットを閉じることです。これにより、処理してスレッドを終了できる がaccept()スローされます。IOException

メソッドを追加しpublic void stop()て、ソケットをクラスのフィールドにします。

private ServerSocket serverSocket;

public ClientConnectionThread() {
    this.serverSocket = new ServerSocket(2901);
}
...
public void stop() {
    serverSocket.close();
}
public void run() {
     while(true) {
         // this will throw when the socket is closed by the stop() method
         Socket client = server.accept();
         ...
     }
}
于 2013-02-19T00:08:33.443 に答える
2

一般的にはしません。を使用して何をしているのかを中断するように要求しThread.interrupt()ます。

理由の良い説明はJavadocにあります。

リンクから:

stopのほとんどの使用法は、ターゲットスレッドの実行を停止する必要があることを示すために変数を変更するだけのコードに置き換える必要があります。ターゲットスレッドはこの変数を定期的にチェックし、変数が実行を停止することを示している場合は、実行メソッドから整然と戻る必要があります。(これは、Javaチュートリアルが常に推奨しているアプローチです。)停止要求の迅速な通信を保証するには、変数が揮発性である必要があります(または変数へのアクセスが同期されている必要があります)。

Thread.interrupt待機中のスレッドが応答しないすべての状況で、どちらにも応答しないことに注意してくださいThread.stop

特定の状況serverSocket.closeでは、に応答しないため、を呼び出す必要がありますThread.interrupt

于 2013-02-19T00:15:00.213 に答える