私は長時間実行する必要がありますサーバーを持って、それはIOのためのいくつかのバックグラウンドスレッドを生成します。バックグラウンド/ IOスレッドがダウンしないようにしようとしているか、スレッドがダウンした場合にそれらが戻ってくるかどうかを確認しようとしています。
現在のソリューション
現在、私のメインループは、単にすべてのバックグラウンドチェック(以下擬似コード)の状態をチェックします。私は良い方法があるはずだと思う。
while (!Thread.currentThread().isInterrupted()) {
maintainThreads();
doWork();
condition.await(30, TimeUnit.SECONDS);
}
私の試み
私はそれが次のタスクを引いたときRunnable
を削除することはできませんカスタムqueue
で、SingleThreadExecutor
への切り替えを検討しています。 executor
は私のためにスレッドを管理するので、メインループから取り除くことができます。
スレッドごとに1つのエグゼキュータを置くとパフォーマンスが低下し、この問題の解決方法はよりシンプル/優れていると心配です。また、スレッドごとにシャットダウンフックを設定して、スレッドを再起動させることも検討しました。
ご協力いただければ幸いです。
「下に行く」とはどういう意味ですか?コードが含まれているために例外がスローされることを意味しますか? try/catchに 'run()'メソッドの本体をラップするだけで、スレッドが例外で終了するのを防ぐことができます。しかし 'doWork()'の意味をかなり長く考えなければなりません。例外をスローする他のメソッド続けることも可能ですか? – BeeOnRope
[UncaughtExceptionHandler](http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.UncaughtExceptionHandler.html?is-external=true)? – GPI
@BeeOnRope私が維持しているスレッドは、チェックされたすべての例外を既に捕捉しているIO接続( 'doWork()'のプロデューサ)だけです。スレッドが終了する場合は、メインループが回転しているだけです。問題を記録し、接続するまで再作成してください。私の主な質問は、「プログラムが実行されている限りスレッドを実行して、何が問題になったとしても、それを行う最もクリーンな方法は何か」ということです。 – billie