最近、次のような質問を受けました。
setPriority()
低優先度のスレッドを設定する方法があります。では、なぜデーモン スレッドが必要なのでしょうか。それらの違いは何ですか?
スレッドをデーモンとしてマークすると、スケジューリングが変更されますか?
最近、次のような質問を受けました。
setPriority()
低優先度のスレッドを設定する方法があります。では、なぜデーモン スレッドが必要なのでしょうか。それらの違いは何ですか?
スレッドをデーモンとしてマークすると、スケジューリングが変更されますか?
スレッドの優先度を低く設定するための setPriority() メソッドがあります。では、なぜデーモン スレッドが必要なのでしょうか。それらの違いは何ですか?
通常、デーモン スレッドは優先度とは何の関係もありません。デーモン以外のすべてのユーザー スレッドが終了すると、JVM はシャットダウンします。スレッドをデーモン スレッドとしてマークすることは、JVM の終了時にスレッドを安全に強制終了できることを意味します。
優先度はスケジューリングに関するものです。実行準備ができている他のスレッドと比較して、スレッドがタイム スライスを取得する頻度に関するものです。優先度の低いデーモン スレッドまたは優先度の高いデーモン スレッドを使用できます。優先度が低く、優先度が高い非デーモン スレッドを使用することもできます。余談ですが、スレッドの優先度は特定の状況でしか適用されず、特定のアーキテクチャにのみ適用されます。Java スレッドの専門家として、私はそれらを使用したことはありません。
少なくとも Java スレッド モデルでは、概念は直交 (相互に独立) しています。
スレッド デーモンを作成するタイミングに関しては、JVM の終了時に中断されても構わないタスク (キープアライブ スレッド、統計プロセッサ、ログ処理など) にはデーモン スレッドを使用します。アプリケーションは非デーモン スレッドであり、なんらかの方法で終了するには、具体的に中断するかシグナルを送る必要があります。
実行中のデーモン スレッドは、プログラムの終了/終了を妨げません。ただし、プログラムを終了する前に、すべてのユーザー スレッドを終了する必要があります。優先順位は、デーモン スレッドまたはユーザー スレッドのいずれかに適用されます。priority
日常生活と同じように理解できるかもしれません。
Java ランタイムが、アプリケーションで実行されている唯一のスレッドがデーモン スレッドである (つまり、ユーザー スレッドが存在しない) と判断した場合、Java ランタイムはアプリケーションを即座に閉じ、すべてのデーモン スレッドが停止します。アプリケーションの実行を継続するには、少なくとも 1 つのライブ ユーザー スレッドが常に必要です。その他の点では、Java ランタイムはデーモン スレッドとユーザー スレッドをまったく同じ方法で扱います。
ただし、デーモン スレッドでは、JVM が突然終了し、最終的にブロックが実行されず、スタックが巻き戻されず、JVM が終了するだけです。このため、デーモン スレッドは慎重に使用する必要があり、何らかの I/O を実行する可能性のあるタスクにデーモン スレッドを使用するのは危険です。