誰かがJavaにどんなデーモンスレッドがあるか教えてもらえますか?
誰かがJavaにどんなデーモンスレッドがあるか教えてもらえますか?
回答:
デーモンスレッドは、プログラムの終了時にJVMの終了を妨げないスレッドですが、スレッドはまだ実行中です。デーモンスレッドの例は、ガベージコレクションです。
このsetDaemon(boolean)
メソッドを使用してThread
、スレッドが開始する前にデーモンのプロパティを変更できます。
setDamon(boolean)
に、スレッドが開始される前にのみ呼び出すことができます。デフォルトでは、スレッドはその親スレッドのデーモンステータスを継承します。
thread that does not prevent the JVM from exiting when the program finishes but the thread is still running
基本的に、スレッドを開始したJVMプロセスが、デーモンスレッドの実行が終了したかどうかに関係なく、すべての通常のスレッドが実行を終了した場合に終了します。
さらにいくつかのポイント(リファレンス:Java同時実行の実際)
デーモン以外のスレッドがすべて終了すると、JVMは停止し、残りのデーモンスレッドはすべて破棄されます。
このため、デーモンスレッドは控えめに使用する必要があり、あらゆる種類のI / Oを実行する可能性のあるタスクにそれらを使用することは危険です。
finally
ブロックは実行されません。したがって、System.exit(…)
I / Oを実行している実行中のスレッドがあると思われる場合は呼び出さないでください。唯一の違いは、デーモンスレッドのみが残っている場合、JVMは独自の終了をトリガーするということです。
上記の答えはすべて良いです。違いを説明するための簡単なコードスニペットを次に示します。のtrueとfalseの各値で試してくださいsetDaemon
。
public class DaemonTest {
public static void main(String[] args) {
new WorkerThread().start();
try {
Thread.sleep(7500);
} catch (InterruptedException e) {
// handle here exception
}
System.out.println("Main Thread ending") ;
}
}
class WorkerThread extends Thread {
public WorkerThread() {
// When false, (i.e. when it's a user thread),
// the Worker thread continues to run.
// When true, (i.e. when it's a daemon thread),
// the Worker thread terminates when the main
// thread terminates.
setDaemon(true);
}
public void run() {
int count = 0;
while (true) {
System.out.println("Hello from Worker "+count++);
try {
sleep(5000);
} catch (InterruptedException e) {
// handle exception here
}
}
}
}
従来、UNIXのデーモンプロセスは、Windowsのサービスと同様に、常にバックグラウンドで実行されていました。
Javaのデーモンスレッドは、JVMの終了を妨げないスレッドです。具体的には、デーモンスレッドのみが残っている場合、JVMは終了します。を作成するには、のsetDaemon()
メソッドを呼び出しThread
ます。
デーモンスレッドを読んでください。
デーモンスレッドは、デーモンスレッドと同じプロセスで実行されている他のスレッドまたはオブジェクトのサービスプロバイダーのようなものです。デーモンスレッドは、バックグラウンドサポートタスクに使用され、通常のスレッドの実行中にのみ必要です。通常のスレッドが実行されておらず、残りのスレッドがデーモンスレッドである場合、インタプリタは終了します。
たとえば、HotJavaブラウザは、「Image Fetcher」という名前の最大4つのデーモンスレッドを使用して、ファイルシステムまたはネットワークから、必要なスレッドの画像をフェッチします。
デーモンスレッドは通常、アプリケーション/アプレットのサービスを実行するために使用されます(「フィドルビット」の読み込みなど)。ユーザースレッドとデーモンスレッドの主な違いは、JVMはすべてのユーザースレッドが終了したときにのみプログラムをシャットダウンするということです。デーモンスレッドは、実行のメインスレッドを含む実行中のユーザースレッドがなくなると、JVMによって終了します。
setDaemon(true / false)?このメソッドは、スレッドがデーモンスレッドであることを指定するために使用されます。
public boolean isDaemon()?このメソッドは、スレッドがデーモンスレッドであるかどうかを判断するために使用されます。
例えば:
public class DaemonThread extends Thread {
public void run() {
System.out.println("Entering run method");
try {
System.out.println("In run Method: currentThread() is" + Thread.currentThread());
while (true) {
try {
Thread.sleep(500);
} catch (InterruptedException x) {}
System.out.println("In run method: woke up again");
}
} finally {
System.out.println("Leaving run Method");
}
}
public static void main(String[] args) {
System.out.println("Entering main Method");
DaemonThread t = new DaemonThread();
t.setDaemon(true);
t.start();
try {
Thread.sleep(3000);
} catch (InterruptedException x) {}
System.out.println("Leaving main method");
}
}
出力:
C:\java\thread>javac DaemonThread.java
C:\java\thread>java DaemonThread
Entering main Method
Entering run method
In run Method: currentThread() isThread[Thread-0,5,main]
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
Leaving main method
C:\j2se6\thread>
印刷スプールやファイル転送などのサービスの要求を処理するバックグラウンドプロセスであり、不要な場合は休止状態です。
デーモンスレッドは、アプリケーション内に存在することができます要求や様々なchronjobsを扱うようにバックグラウンドでいくつかのタスクを実行すると考えられているスレッドです。
プログラムにデーモンスレッドしか残っていない場合、プログラムは終了します。これは通常、これらのスレッドが通常のスレッドと連携して動作し、イベントのバックグラウンド処理を提供するためです。
メソッドを使用して、a Thread
がデーモンであることを指定できます。setDaemon
通常は終了せず、中断もされません。アプリケーションが停止すると停止します。
私が明確にしたい1つの誤解:
Javaには、デーモンスレッドと呼ばれる特別な種類のスレッドがあります。
デーモンスレッドは何に使用されますか?
通常、通常のスレッドのサービスプロバイダーとして使用されます。通常、サービスリクエストを待機するか、スレッドのタスクを実行する無限ループがあります。彼らは重要な仕事をすることができません。(彼らがいつCPU時間を持つようになるかわからないので、他に実行中のスレッドがなければ、いつでも終了することができます。)
この種のスレッドの典型的な例は、Javaガベージコレクタです。
さらにあります...
setDaemon()
メソッドを呼び出す前にメソッドを呼び出すだけですstart()
。スレッドが実行中になると、そのデーモンのステータスを変更することはできません。isDaemon()
メソッドを使用して、スレッドがデーモンスレッドかユーザースレッドかを確認します。Javaのデーモンスレッドは、バックグラウンドで実行され、ガベージコレクションやその他のハウスキーピングタスクなどのバックグラウンドタスクを実行するためにJVMによって作成されるスレッドです。
注意点:
Javaでメインメソッドを実行するメインスレッドによって作成されたスレッドは、デフォルトでは非デーモンです。これは、スレッドが親スレッドを作成するスレッドからデーモンの性質を継承し、メインスレッドが非デーモンスレッドであるため、メインスレッドから作成される他のスレッドがsetDaemon(true)を呼び出して明示的にデーモンを作成するまで、非デーモンのままにします。
Thread.setDaemon(true)はスレッドデーモンを作成しますが、Javaでスレッドを開始する前にのみ呼び出すことができます。対応するスレッドが既に開始され、実行されている場合は、IllegalThreadStateExceptionをスローします。
Javaのデーモンスレッドと非デーモンスレッドの違い:
1)JVMは、存在する前にデーモンスレッドが完了するのを待ちません。
2)JVMが終了するとき、デーモンスレッドはユーザースレッドとは異なる方法で処理され、最終的にブロックは呼び出されず、スタックは巻き戻されず、JVMは単に終了します。
ユーザースレッドが存在しないためにjvmが終了した場合のデーモンスレッドの動作をテストする例を次に示します。
以下の出力の最後の2行目に注意してください。メインスレッドが終了すると、デーモンスレッドも終了し、finallyブロック内でfinally 実行9ステートメントが出力されませんでした。つまり、ユーザースレッドが存在しないためにJVMが終了した場合、デーモンスレッドのfinallyブロック内で閉じられたI / Oリソースは閉じられません。
public class DeamonTreadExample {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
int count = 0;
while (true) {
count++;
try {
System.out.println("inside try"+ count);
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
System.out.println("finally executed"+ count);
}
}
});
t.setDaemon(true);
t.start();
Thread.currentThread().sleep(10000);
System.out.println("main thread exited");
}
}
inside try1
finally executed1
inside try2
finally executed2
inside try3
finally executed3
inside try4
finally executed4
inside try5
finally executed5
inside try6
finally executed6
inside try7
finally executed7
inside try8
finally executed8
inside try9
finally executed9
inside try10
main thread exited
デーモンスレッドは、誰もが説明したように、JVMを終了するように制限しないので、基本的に、終了の観点から見ると、アプリケーションにとってハッピーなスレッドです。
サードパーティのサーバーやJMSにデータをプッシュするようなAPIを提供しているときにデーモンスレッドを使用できるようにしたい場合は、クライアントのJVMレベルでデータを集約してから、別のスレッドでJMSに送信する必要があるかもしれません。これがサーバーにプッシュされる必須データでない場合は、このスレッドをデーモンスレッドとして作成できます。この種のデータは、ログプッシュ/集約のようなものです。
よろしく、マニッシュ
デーモンスレッドは、リソースの管理を担当するデーモンプロセスに似ています。デーモンスレッドは、ユーザースレッドを提供するためにJava VMによって作成されます。UNIXの更新システムの例、unixはデーモンプロセスです。デーモンスレッドの子は常にデーモンスレッドであるため、デフォルトではデーモンはfalseです。「isDaemon()」メソッドを使用して、デーモンまたはユーザーとしてスレッドを確認できます。したがって、デーモンスレッドまたはデーモンプロセスは、基本的にリソースの管理を担当します。たとえば、jvmを起動すると、ガベージコレクターが実行されます。これは、優先度が1で最も低いデーモンスレッドで、メモリを管理しています。ユーザースレッドが有効である限り、jvmは有効です。uはデーモンスレッドを強制終了できません。jvmはデーモンスレッドを強制終了します。
コードでのみ実際の例を使って話しましょう。私は上記のrussの答えが好きですが、疑わしい点を取り除くために、少し拡張しました。私はそれを2回実行しました。1回はワーカースレッドをデーモンtrueに設定し(別のスレッド)、もう1回はfalseに設定しました(ユーザースレッド)。メインスレッドが終了するとデーモンスレッドが終了することを確認します。
public class DeamonThreadTest {
public static void main(String[] args) {
new WorkerThread(false).start(); //set it to true and false and run twice.
try {
Thread.sleep(7500);
} catch (InterruptedException e) {
// handle here exception
}
System.out.println("Main Thread ending");
}
}
class WorkerThread extends Thread {
boolean isDeamon;
public WorkerThread(boolean isDeamon) {
// When false, (i.e. when it's a user thread),
// the Worker thread continues to run.
// When true, (i.e. when it's a daemon thread),
// the Worker thread terminates when the main
// thread terminates.
this.isDeamon = isDeamon;
setDaemon(isDeamon);
}
public void run() {
System.out.println("I am a " + (isDeamon ? "Deamon Thread" : "User Thread (none-deamon)"));
int counter = 0;
while (counter < 10) {
counter++;
System.out.println("\tworking from Worker thread " + counter++);
try {
sleep(5000);
} catch (InterruptedException e) {
// handle exception here
}
}
System.out.println("\tWorker thread ends. ");
}
}
result when setDeamon(true)
=====================================
I am a Deamon Thread
working from Worker thread 0
working from Worker thread 1
Main Thread ending
Process finished with exit code 0
result when setDeamon(false)
=====================================
I am a User Thread (none-deamon)
working from Worker thread 0
working from Worker thread 1
Main Thread ending
working from Worker thread 2
working from Worker thread 3
working from Worker thread 4
working from Worker thread 5
working from Worker thread 6
working from Worker thread 7
working from Worker thread 8
working from Worker thread 9
Worker thread ends.
Process finished with exit code 0
デーモンスレッドは一般に「サービスプロバイダー」スレッドとして知られています。これらのスレッドは、プログラムコードではなくシステムコードの実行に使用する必要があります。これらのスレッドはコードと並行して実行されますが、JVMはいつでもスレッドを強制終了できます。JVMがユーザースレッドを検出しない場合、JVMはそれを停止し、すべてのデーモンスレッドは即座に終了します。次のコマンドを使用して、デーモン以外のスレッドをデーモンに設定できます。
setDaemon(true)
デーモンスレッドは、プロセスの他の非デーモンスレッドがまだ実行されている限り、バックグラウンドで実行されるスレッドです。したがって、すべての非デーモンスレッドが完了すると、デーモンスレッドは終了します。非デーモンスレッドの例は、メインを実行しているスレッドです。スレッドは、setDaemon()
、スレッドが開始される前にメソッドを
詳細情報:Javaのデーモンスレッド
私にとって、デーモンスレッドは、ユーザースレッドのハウスキーパーのようなものです。すべてのユーザースレッドが終了した場合、デーモンスレッドにはジョブがなく、JVMによって強制終了されます。YouTubeの動画で説明しました。
JVMは、最後の非デーモンスレッドの実行が完了すると、作業を完了します。デフォルトでは、JVMはスレッドを非デーモンとして作成しますが、methodを使用してスレッドをデーモンとして作成できますsetDaemon(true)
。デーモンスレッドの良い例は、すべての非デーモンスレッドが完了するとすぐに作業を完了するGCスレッドです。
デーモンスレッドは、作成者スレッドが終了すると終了します。
非デーモンスレッド(デフォルト)は、メインスレッドよりも長く存続できます。
if ( threadShouldDieOnApplicationEnd ) {
thread.setDaemon ( true );
}
thread.start();
join
編集された後でも、メインスレッドが実行されている限り、デーモンは残ります。
Thread
javadocツールは、彼らが何であるかを説明します。java.sun.com/javase/6/docs/api/java/lang/Thread.html