2012-01-11 15 views
0

私は、指定されたホスト名とポートで着信接続を待ち受けるアプリケーションを持っています。リスニングは、listen()(以下を参照)メソッドで呼び出されます。これは、入力ストリームを処理するための新しいThreadを作成して、受信接続を常に受信するためにServerSocket.accept()を使用して待機します。ソケットからIOを待っているスレッドを中断していますか?

private ServerSocket serverSocket; 
private Thread listenerThread; 

public void listen() throws IOException { 
    this.listenerThread = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      while (true) { 
       try { 
        Socket socket = TheServerClass.this.serverSocket.accept(); 
        // Create new thread to handle the incoming connection 
       } 
       catch (IOException exc) { } 
      } 
     } 
    }); 
    this.listenerThread.start(); 
} 

ここでは、実行を中止したいと考えています。listenerThreadしかし、私がthis.listenerThread.interrupt()に電話すると、これは動作しません。
スレッドを中断してスレッドを停止できると思ったのですが、なぜそれが機能していないのですか?

お知らせ:可能な解決策は、this.serverSocket.close()を使用してServerSocketを閉じることであるが、それはinterrupt()か何かを達成することができますか?)

+0

標準ソケットを使用する場合、これはソケットを閉じることによってのみ可能です。同じ問題を扱っているので、ここでいくつかの質問があります。 http://stackoverflow.com/questions/1510403/how-to-unblock-a-thread-blocked-on-serversocket-accept –

+0

それは機能しないとはどういう意味ですか?それは何か例外を投げますか?それとも普通は続きますか? – medopal

+0

@medopalスレッドは終了せずに実行を継続します。 –

答えて

1

コールserverSocket.close()

あなたはまだIOを行っていないので、私は推測する - あなたはそれを中断することはできません、とaccept()以来、あなたはそれを中断することはできません例外:InterruptedExceptionをスローしません。スレッドは中断されますが、そのフラグは自分で確認する必要がありますThread.isInterrupted()

How can I interrupt a ServerSocket accept() method?を参照してください。ちょうど糸のsetStop()メソッドを呼び出す

public class MyThread extends Thread { 

    private boolean stop; 
    private ServerSocket serverSocket; 

    public MyThread(ServerSocket ss) { 
     this.serverSocket = ss; 
     this.stop = false; 
    } 

    public void setStop() { 
     this.stop = true; 
     if (this.ss != null) { 
      this.ss.close(); 
     } 
    } 

    public void run() { 
     while (!stop) { 
      try { 
       Socket socket = serverSocket.accept(); 
       // Create new thread to handle the incoming connection 
      } 
      catch (IOException exc) { } 
     } 
    } 
} 

listen()方法から:

+0

'accept()'は中断することができないので(私の意見ではちょっと変わっていますが、それになります)、 'close()'を使わなければならないと思います...助けてくれてありがとう! –

+0

助けになることはありません。 – polve

1

答えは質問です。ソケットを閉じる必要があります。それはserverSocket.close()を使って行われます。 Thread.interrupt()はソケットを気にしません。

0

はこれを使用してください。

+0

いいえ。少なくとも 'stop'をvolatile宣言する必要があります。そうしないと、コンパイラは異なる方法でスレッドを最適化することができます。 – ivant

関連する問題