私はDeamonスレッドのバックグラウンドスレッドを知っています。 setDaemon(true)
を呼び出すことで独自のデーモンスレッドを作成できます。デーモンスレッドはいつ便利ですか?
私の質問は、なぜ、いつデーモンスレッドとしてスレッドを作成する必要がありますか?
私はDeamonスレッドのバックグラウンドスレッドを知っています。 setDaemon(true)
を呼び出すことで独自のデーモンスレッドを作成できます。デーモンスレッドはいつ便利ですか?
私の質問は、なぜ、いつデーモンスレッドとしてスレッドを作成する必要がありますか?
実行中のスレッドがすべてデーモンスレッドである場合、JVMは終了します。それで、単純なゲームを書いていると想像してください。そこでは、あなたの主な方法はあなたが終了するまでループします。そして、ゲームの開始時に、あなたは何らかのウェブサイトを無期限にポーリングして警告をトリガーするスレッドを開始すると想像してください。ゲームを終了するときにJVMが終了するようにします。無限のポーリングでゲームが終了しないようにする必要はありません。したがって、このポーリングスレッドをデーモンスレッドにします。
Deamonスレッドは、すべての「通常の」スレッドが終了すると自動的にJVMによって終了されます。通常のスレッドは決して自動的に終了しません。
基本的にユーザースレッドを使用せずにユーザーの介入なしにコンシューマーに提供したいサービスは、ユーザースレッドをデーモンとして設定するための主要なユースケースを形成します。
結果として、スレッドが継続的に実行されるユーザースレッドが存在するまでは、JVM保証が存在します。あなたは、GC、UIスレッドなどのような例を見つけることができます。それらはデーモンです。
希望します。
通常、すべてのスレッドがrun()
メソッドを終了すると、プログラムは終了します。デーモンスレッドは、プログラムがまだ実行中であっても終了することを防ぎません。すなわち、run()
を実行します。
スレッドがまだ実行されているときにプログラムの終了を防止しない場合は、デーモンスレッドを使用する必要があります。たとえば、長期間の定期的なタスクの場合は典型的ですが、実際にはプログラム、デザイン、および好みに大きく依存します。
他にも指摘したように、このスレッドがまだ実行されているときにプログラムが終了すると、デーモンスレッドはJVMを終了させません。
一般に、スレッドに副作用がないことが絶対に確実でない限り、デーモンスレッドを作成しないでください。スレッドがいつ停止するかは分からないので、ファイナライザブロックは実行されず、スタックは解かれません。したがって、デーモンスレッドでIO操作を使用しないようにしてください。データが破損する可能性があるからです。
私は、Timerでそれらを使用して、すぐに削除できないファイルを削除しました。つまり、.exeファイルを生成し、実行してから削除します。しかし、終了時に画像がまだブロックされていると思われるため、executable.delete
が失敗する確率は50%です。プロセスが完全に終了した後でのみ、実行可能イメージを確実に削除することができます。しかし、どれくらいの時間がかかりますか?したがって、.deleteではなく.deleteOnExitを設定します。しかし、Javaマシンが終了するまで待つことは望ましくありません。それは非常に長くかかることがあります。また、不要な何百万もの愚かな.exeファイルがファイルシステムにぶら下がりたくなることはありません。したがって、実行可能ファイルの実行可能ファイルを1〜2秒後にタイマーにスケジュールするようにします。しかし、タイマーは通常のスレッドではありません。そうであれば、削除するファイルがなくてもプログラムの終了をブロックします。私は簡単にデーモンを作ることができます。なぜなら、私のファイルが削除されたかどうかはタイマーでは重要ではないからです。ファイルはデーモンかjava終了のどちらかで削除されます。私はそれがデーモンの完璧な使用だと思う。
Javaのデーモンスレッドは、デーモンスレッドと同じプロセスで実行されている他のスレッドまたはオブジェクトのサービスプロバイダに似ています。デーモンスレッドは、バックグラウンドをサポートするタスクに使用され、通常のスレッドの実行中にのみ必要です。通常のスレッドが実行されておらず、残りのスレッドがデーモンスレッドの場合、インタープリタは終了します。
新しいスレッドが作成されると、そのスレッドはその親のデーモンのステータスを継承します。通常のスレッドとデーモンスレッドは、終了時に何が起こるかが異なります。 JVMが停止すると、残っているデーモン・スレッドはすべて破棄されます。最後にブロックは実行されず、スタックは解放されません.JVMが終了します。このため、デーモン・スレッドは控えめに使用する必要があり、あらゆる種類のI/Oを実行する可能性のあるタスクに使用することは危険です。
デーモンスレッドでIO操作を使用しないでください。データ。 –
あなたの例では、ユーザーがゲームを終了することを決定したときに、デーモンスレッドではなくユーザースレッドがまだ実行されている場合、JVMはブロックしますか? – Kal
@Kal:はい、そうです。ユーザースレッドは、JVMのシャットダウンを維持します。 –
はい:メインメソッドが単に戻ると、JVMは実行を継続します。もちろん、System.exitを呼び出すと、実行を停止します。 –