2012-02-12 12 views
2

私はJavaでマルチスレッドサーバアプリケーションを書いています。 すべて正常に動作しますが、少し問題があります。 着信接続要求を待ち受けるrunnableを停止すると、ソケットは存在し続けます。だから私の質問は:どのように実行可能オブジェクトを停止し、この実行可能ファイルで作られたすべてのオブジェクトをクリーンアップするのですか?Java:ソケットで実行可能オブジェクトをクリーンアップ

スレッドを停止させるためのコード:

Runnable tr = new Worldwide() ; 
     Thread thread = new Thread(tr) ; 
     thread.start() ; 
     online = true ; 

     while (core.getServerSate()) { 
      try{ 
      Thread.sleep(200); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } ; 
     thread.stop() ; 
     thread. 
     core.printToConsole("Server is offline now") ; 

たRunnableコード:

public class Worldwide implements Runnable { 

Core core = Core.getInstance() ; 

public Worldwide() { 

} 
@Override 
public void run() { 

    try { 
    ServerSocket server = new ServerSocket(port) ; 

    core.printToConsole("Server is online") ; 
    core.printToConsole ("listening on port :" + server.getLocalPort()) ; 
    while (core.getServerSate() == true) { 

     Socket client = server.accept() ; 
     Runnable tr = new ClientCommunication(client) ; 
     new Thread (tr).start() ; 

    } 

    } 
    catch(Exception e) { 
     core.printToConsole ("An error occured while going online") ; 
     e.printStackTrace() ; 
    } 
    } 

おかげで、トム

+0

'Thread.stop'を使わないでください。このメソッドは推奨されていません。その代わりに、 'Thread.interrupt'を使用して、スレッドの割り込み状態に基づいてループロジックを構築することが最善です。割り込みを捕まえたら、それを伝播する必要があります。 – mre

+0

ループはソケットclient = server.accept();で停止するので、私にとってはうまくいかないでしょう。 – tb96

答えて

2

メインスレッドからソケットを閉じることができます。これにより、acceptへの呼び出しが中断され、IOExceptionがスローされます。 IOExceptionのcatchからacceptスレッドのrunメソッドを終了できます。

+0

答えてくれてありがとう。しかし、メインスレッドからソケットを閉じるにはどうすればいいですか? – tb96

+0

@ tb96。メインスレッドでソケットを作成し、それをワーカースレッドに渡す必要があります。こうすれば、両方のスレッドにソケットオブジェクトがあり、ワーカースレッドでは 'accept'を呼び出し、メインスレッドでは' close'を呼び出すことができます。 – Tudor

+0

ありがとう、これは私が必要とした答えでした:) – tb96

1

は、明示的にclose -methodを呼び出すことによりServerSocketのを閉じる必要がありますソケット。これを行う最も良い場所は、Worldwideクラスのrunメソッド、finallyブロックです(したがって、例外が発生してもソケットは閉じられます)。

+0

答えをありがとう。 – tb96

関連する問題