2011-12-27 7 views
2

少し(シングルスレッド)サーバーを作成し、 "work"コードをRunnableに入れました。この実行可能は、その後Javas Executorのフレームワークを使用して、バックグラウンドスレッドで実行されます。待機中のサーバをシャットダウンする方法は?

ExecutorService exec = Executors.newSingleThreadExecutor(); 
exec.execute(runnable); 

はだから今、私は、このサーバーをシャットダウンするための良い方法を探しています。プログラムを再起動せずにサーバーを再起動する可能性を追加したいので、プロセス全体を終了することはオプションではありません。私を悩ますことは、プログラムがライン7(socket.accept())に達した、と私はstop() -methodを呼び出す場合、サーバはまだまで待つということ、である

class LifecycleWebServer { 
    private final ExecutorService exec = ...; 

    public void start() throws IOException { 
     ServerSocket socket = new ServerSocket(80); 
     while (!exec.isShutdown()) { 
      final Socket conn = socket.accept(); 
      // Do stuff with the connection... 
     } 
    } 

    public void stop() { exec.shutdown(); } 
} 

What I have foundはこのようなものです最後に1つの接続が確立され、シャットダウンされました。

これに対処する方法はありますか?

+0

を私はC/C++で書かれたソケットコードについて同様の質問を掲示し、偉大な答えを得ました。同様の効果を得るには、非ブロッキングソケットを使用する必要があると思われます。他のスレッドからソケットを閉じて、socket.acceptによってスローされた例外をキャッチしようとしましたか?実際にうまくいくかどうかは分かりません。 http://stackoverflow.com/questions/2486335/wake-up-thread-blocked-on-accept-call – selbie

+2

似たような質問:http://stackoverflow.com/questions/2983835/how-can-i-interrupt-a -serversocket-accept-method - ソケットを閉じる必要があるようです。 –

+0

[同様の質問] [1]: - あなたはソケット を閉じる必要がありように思える[1]:http://stackoverflow.com/questions/2983835/how-can-i-interrupt-a- serversocket-accept-method –

答えて

1

したがって、ServerSocketを呼び出すことは、これを行う方法の1つです。close()が待機中です。その場合、accept()の方法ではSocketExceptionが投げられ、捕まえなければなりません。

別、多分明確な方法は、ここでは詳細に説明された「ポイズンピル」、使用することです:How to interrupt a BlockingQueue which is blocking on take()?