2013-03-17 6 views
5

私は並行性とスレッドに新しいです - そして、仕事で私のアプリケーションを開発する際にそれらを使用しています。基本的に私は、ファイルの変更をポーリングするRMIアプリケーション(サーバー側コンポーネント)に数多くのスレッドを持っています(これらのファイルは数秒ごとに更新されます)。デーモンスレッドJava

devボックスでテストするときは、コマンドラインからサーバーを実行していましたが、終了してリンスして1日を通して繰り返してください。

- 私はコマンドラインをシャットダウンしても処理を続行してもスレッドが停止していない可能性があります。これはいくつかの非常に悪い副作用を招いていますが、これが可能であれば私は100%確信していませんので、誰かがこれが正しいかもしれないことを確かめることができます。

私はスレッドをデーモンにします。これは、コマンドラインを閉じると、これらのスレッドが自動的に停止することを意味しますか?私はきれいにアプリケーションを終了するいくつかの方法が必要ですが、サーバーが最終的にautosysで実行されますので、私は

おかげ

+0

この質問には多少の傾きがあり、また身体の中に別の質問があります。閉じていなければ本当に感謝します – Biscuit128

+0

あなたの主な質問は、Javaの "デーモン"重複した質問へのリンクあなたの他の質問(あなたのアプリケーションを安全にシャットダウンすることを前提としています)については、それは別の質問ですので、別に質問する必要があります。 – Jeffrey

答えて

1

次のコードをシャットダウンすると、すべてのスレッドが終了し作るための最善の方法は、作成を示していただきましたことを確認していませんアプリケーションが終了すると、実行中のすべてのタスクをキャンセルしてスレッドプールをきれいに閉じるシャットダウンフックが実行されます。

私はCallableを使用する必要はありません。RunnablesとthreadPool.executeメソッドを使用して、少し優雅なthreadPoolを終了することができます。

final ExecutorService threadPool = Executors.newCachedThreadPool(); 
    final List<Future<Void>> runningTasks = new ArrayList<>(); 
    Future<Void> task = threadPool.submit(new Callable<Void>() { 

     @Override 
     public Void call() throws Exception { 
      int count = 0; 
      while(true) { 
       System.out.println(++count); 
       Thread.sleep(1000); 
      } 
     } 
    }); 
    runningTasks.add(task); 

    Runtime.getRuntime().addShutdownHook(new Thread() { 
     @Override 
     public void run() { 
      for(Future<Void> runningTask : runningTasks) { 
       runningTask.cancel(true); 
      } 
      threadPool.shutdownNow(); 
     } 
    }); 

シャットダウンフックは、スタンドアロンアプリケーション用です。 Java EEコンテナでは、javax.servlet.ServletContextListenerを使用して同じことを実行できます。

+0

アドバイスをいただきありがとうございます。これは、シャットダウンフックに反対のサーブレットコンテキストリスナーを使用する必要があることを意味しますか?これは同じ種類のものですか? – Biscuit128

+0

スタンドアロンのJavaアプリケーションでは、ContextListenerを使用するJava Webアプリケーションでシャットダウンフックを使用できます。クライアントまたはサーバー上のスレッドをクリーンアップするかどうかによって異なります。 – JayTee

+0

はいすべてのスレッドを停止する必要があります。 – Biscuit128

1

スレッドはJava仮想マシン内で実行されます。 JVMを停止すると、スレッドはもう実行されません。 JVMを終了すると、コンピュータのプラグを抜くことができます。もう何も実行できません。

0

RMIランタイムは、停止できないスレッドを作成します。サービスをシャットダウンする唯一の方法は、System.exit()です。

私はこれを別のスレッドで行います。後:新しいShutThread()。start()、シャットダウンスレッドは、残っているメッセージに移動を完了するチャンスを与えるために2秒待ってから、System.exit()を発行します。

+0

コマンドラインから起動されたサーバで、java -jar server.jarを使用して引数なし - これが実行されると、正常に終了するようにメッセージを渡すにはどうすればよいでしょうか? – Biscuit128

+0

良い点。私はシャットダウンする方法を含む標準的なプラクティスなので、サーバーソフトウェアを記述します。他の人がこの機能を許可しない場合、おそらく彼らはそうするべきです。 – edharned

関連する問題