Javaのデーモンスレッドとは何ですか?


809

誰かがJavaにどんなデーモンスレッドがあるか教えてもらえますか?


20
Threadjavadocツールは、彼らが何であるかを説明します。java.sun.com/javase/6/docs/api/java/lang/Thread.html
skaffman


2
デーモンスレッドの場合、JVMが停止すると、すべてのデーモンスレッドが終了します。このため、クリーンアップが実行されない可能性があるため、デーモンスレッドを頻繁に使用しないでください。たとえば、I / Oは正常に終了せず、最後まで書き込み/読み取りを行いません。
msj121 2015

回答:


631

デーモンスレッドは、プログラムの終了時にJVMの終了を妨げないスレッドですが、スレッドはまだ実行中です。デーモンスレッドの例は、ガベージコレクションです。

このsetDaemon(boolean)メソッドを使用してThread、スレッドが開始する前にデーモンのプロパティを変更できます。


210
後世のためsetDamon(boolean)に、スレッドが開始される前にのみ呼び出すことができます。デフォルトでは、スレッドはその親スレッドのデーモンステータスを継承します。
グレー

1
「プログラムが終了してもスレッドがまだ実行されているときにJVMが終了するのを防ぐことはできません」と、@ sateeshは「残りのデーモンスレッドはすべて中止され、JVMが停止する」と述べています。では、JVMの終了時にデーモンスレッドは実行を終了するのでしょうか。
ジェラルド

23
@ Gerald、JVMの終了時にすべてのスレッドが強制終了されます。B_erbは、「...プログラムが終了すると」と述べました。つまり、プログラムが明示的にJVMを強制終了しない場合、デーモン以外の最後のスレッドが終了すると、JVMは自動的に強制終了します。通常のスレッドは、「プログラムが終了するとき」を定義します。デーモンスレッドにはありません。
ソロモンスロー

2
したがって、この行はthread that does not prevent the JVM from exiting when the program finishes but the thread is still running基本的に、スレッドを開始したJVMプロセスが、デーモンスレッドの実行が終了したかどうかに関係なく、すべての通常のスレッドが実行を終了した場合に終了します。
Bhargav 2017

1
@SolomonSlow JVMが終了したときに、デーモンスレッド(たとえば、ガベージコレクター)がまだ機能しているときにデーモンスレッドを強制終了すると、どのような影響がありますか?ありがとう。
Venkat Ramakrishnan

340

さらにいくつかのポイント(リファレンス:Java同時実行の実際

  • 新しいスレッドが作成されると、そのスレッドはその親のデーモンステータスを継承します。
  • デーモン以外のスレッドがすべて終了すると、JVMは停止し、残りのデーモンスレッドはすべて破棄されます。

    • 最終的にブロックは実行されません
    • スタックは巻き戻されません-JVMは終了するだけです。

    このため、デーモンスレッドは控えめに使用する必要があり、あらゆる種類のI / Oを実行する可能性のあるタスクにそれらを使用することは危険です。


3
I / Oにデーモンスレッドを使用してはいけないのはなぜですか?BufferedWritersなどがフラッシュされないことが心配ですか?
Paul Cager 2013

4
@PaulCagerええ、彼らは書き込み/読み取りの途中でひざで途切れるだけです。
ランチャー2013

52
第二の点はナンセンスです。JVMが停止すると、スレッドがデーモンであるかどうかに関係なく、すべてのスレッドが停止し、finallyブロックは実行されません。したがって、System.exit(…)I / Oを実行している実行中のスレッドがあると思われる場合は呼び出さないでください。唯一の違いは、デーモンスレッドのみが残っている場合、JVMは独自の終了をトリガーするということです。
Holger

11
「スタックは巻き戻されない」とはどういう意味ですか?
ɢʜʘʂʈʀɛɔʘɴ

2
:@ɢʜʘʂʈʀɛɔʘɴそこにいくつかの説明は、このいずれかを含む「巻き戻しスタック、」上があるflylib.com/books/en/2.254.1.277/1
user766353

175

上記の答えはすべて良いです。違いを説明するための簡単なコードスニペットを次に示します。の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
            }
        }
    }
}

2
@russ良いコードスニペット!WorkerThreadクラスを静的として定義する必要がありました。
xli 2013年

@xliあなたは新しいDaemonTest()。new WorkerThread()。start()も実行できたでしょう:)
abhy

@russの良い例。「setDaemon(true)」を明示的に定義しない場合、デフォルトは「setDeamon(false)」であることを知っていました
huseyin

96

従来、UNIXのデーモンプロセスは、Windowsのサービスと同様に、常にバックグラウンドで実行されていました。

Javaのデーモンスレッドは、JVMの終了を妨げないスレッドです。具体的には、デーモンスレッドのみが残っている場合、JVMは終了します。を作成するには、のsetDaemon()メソッドを呼び出しThreadます。

デーモンスレッドを読んでください。


3
あなたのリンクはこの時点で死んでいます、おそらくあなたは更新したいですか?とにかく、あなたのために+1。
Jasonw

2
UNIXとWindowsの比較が好きです。
Premraj

ここで最高の説明!
LoveMeow 2017

57

デーモンスレッドは、デーモンスレッドと同じプロセスで実行されている他のスレッドまたはオブジェクトのサービスプロバイダーのようなものです。デーモンスレッドは、バックグラウンドサポートタスクに使用され、通常のスレッドの実行中にのみ必要です。通常のスレッドが実行されておらず、残りのスレッドがデーモンスレッドである場合、インタプリタは終了します。

たとえば、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>

37

デーモンの定義(コンピューティング):

印刷スプールやファイル転送などのサービスの要求を処理するバックグラウンドプロセスであり、不要な場合は休止状態です。

-出典:Oxford Dictionariesによる英語

Javaのデーモンスレッドとは

  • デーモンスレッドは、フローとデーモンの間のいつでもシャットダウンできます。つまり、ユーザースレッドは完全に実行されます。
  • デーモンスレッドは、他の非デーモンスレッドが実行されている限り、バックグラウンドで断続的に実行されるスレッドです。
  • 非デーモンスレッドがすべて完了すると、デーモンスレッドは自動的に終了します。
  • デーモンスレッドは、同じプロセスで実行されるユーザースレッドのサービスプロバイダーです。
  • JVMは、Running状態のときにデーモンスレッドが完了することを気にしません。最終的にブロックすることすら実行を許可しません。JVMは、私たちが作成したデーモン以外のスレッドを優先します。
  • デーモンスレッドは、Windowsのサービスとして機能します。
  • JVMは、デーモンスレッドとは対照的に、すべてのユーザースレッドが終了するとデーモンスレッドを停止します。したがって、すべてのユーザースレッドが停止するとすぐにスレッドがJVMによって停止されるため、デーモンスレッドを使用して、たとえば監視機能を実装できます。

System.exit()を呼び出すと、スレッドがデーモンスレッドであるかどうかに関係なく、finallyブロックは実行されません。実際、JVM
がまだ

5
デーモンスレッドは、開始前に変更されていない限り、作成スレッドと同じ優先順位で実行されます。デーモンスレッドは、必ずしも「サービスプロバイダー」やWindowsサービスなど、ここで述べるものではありません。JVMの終了を妨げない単なるスレッドです。限目。
ローンの侯爵

35

デーモンスレッドは、アプリケーション内に存在することができます要求や様々なchronjobsを扱うようにバックグラウンドでいくつかのタスクを実行すると考えられているスレッドです。

プログラムにデーモンスレッドしか残っていない場合、プログラムは終了します。これは通常、これらのスレッドが通常のスレッドと連携して動作し、イベントのバックグラウンド処理を提供するためです。

メソッドを使用して、a Threadデーモンであることを指定できます。setDaemon通常は終了せず、中断もされません。アプリケーションが停止すると停止します。


1
それはデーモンスレッドなので、それが「デーモン」の意味です。あなたの推論は背中合わせです。
ローンの侯爵

15

私が明確にしたい1つの誤解:

  • デーモンスレッド(Bなど)がユーザースレッド(Aなど)内に作成されると仮定します。このユーザースレッド/親スレッド(A)を終了しても、作成したデーモンスレッド/子スレッド(B)は終了しません。提供されたユーザースレッドは、現在実行されている唯一のスレッドです。
  • したがって、スレッドの終了には親子関係はありません。すべてのデーモンスレッド(作成された場所に関係なく)は、単一のライブユーザースレッドがなくなり、JVMを終了させると終了します。
  • これは、両方(親/子)のデーモンスレッドにも当てはまります。
  • 子スレッドがデーモンスレッドから作成された場合、それもデーモンスレッドです。これには、明示的なデーモンスレッドフラグ設定は必要ありません。同様に、ユーザースレッドから作成された子スレッドがユーザースレッドでもある場合、変更する場合は、その子スレッドを開始する前に明示的なデーモンフラグ設定が必要です。

これは何からも引用されていません。引用されていないテキストには引用形式を使用しないでください。「引用」の最初の段落は正しくなく、2番目の段落と矛盾しています。
ローンの侯爵

@EJP GOT IT、だから、誰もがここでは他の人々に引用を与える必要があり、自分のものではない。または私たち自身がどこかに引用していて、ここを指していますか?
Kanagavelu Sugumar 2017年

はい、場合、あなたは、単にどこか他と同じように、ビットをあなたがそれらを引用する必要が誰かを引用あなたは誰にも引用されていない場合、あなたが持っているかのようにそれをフォーマットしないでください。私はあなたの二番目の文の頭と尾を作ることができません。
ローンの侯爵

12

デーモンスレッドとユーザースレッド。一般に、プログラマーによって作成されたすべてのスレッドはユーザースレッドです(デーモンとして指定した場合、または親スレッドがデーモンスレッドである場合を除く)。ユーザースレッドは通常、プログラムコードを実行するためのものです。すべてのユーザースレッドが終了しない限り、JVMは終了しません。


10

Javaには、デーモンスレッドと呼ばれる特別な種類のスレッドがあります

  • 非常に低い優先度。
  • 同じプログラムの他のスレッドが実行されていない場合にのみ実行されます。
  • JVMは、デーモンスレッドがプログラムで実行されている唯一のスレッドである場合、これらのスレッドを終了するプログラムを終了します。

デーモンスレッドは何に使用されますか?

通常、通常のスレッドのサービスプロバイダーとして使用されます。通常、サービスリクエストを待機するか、スレッドのタスクを実行する無限ループがあります。彼らは重要な仕事をすることができません。(彼らがいつCPU時間を持つようになるかわからないので、他に実行中のスレッドがなければ、いつでも終了することができます。)

この種のスレッドの典型的な例は、Javaガベージコレクタです。

さらにあります...

  • setDaemon()メソッドを呼び出す前にメソッドを呼び出すだけですstart()。スレッドが実行中になると、そのデーモンのステータスを変更することはできません。
  • isDaemon()メソッドを使用して、スレッドがデーモンスレッドかユーザースレッドかを確認します。

8
-1、デーモンスレッドが本質的に優先度が低いとは思わない。確かに、私が見たドキュメントにはそのようなものはありません。優先順位とデーモンネスが直交していることも、このSO回答クレーム:stackoverflow.com/a/10298353/839128
MikeFHay

5
デーモンスレッドは優先度とは関係ありません。優先度の高いデーモンスレッドまたは優先度の低い非デーモンスレッドを使用できます。
灰色の

デーモンスレッドは、最初は作成スレッドと同じ優先順位を持っています。
ローンの侯爵

「同じプログラムの他のスレッドが実行されていないときにのみ実行する」という文は誤解を招くものです。
Fredrick Gauss

9

デーモンスレッドはアシスタントのようなものです。非デーモンスレッドはフロントパフォーマーのようなものです。アシスタントは、パフォーマーがジョブを完了するのに役立ちます。ジョブが完了すると、パフォーマーはこれ以上実行するのにヘルプは必要ありません。助けは必要ないので、アシスタントはその場を離れます。したがって、非デーモンスレッドのジョブが終了すると、デーモンスレッドが行進します。


5

デーモンスレッドは、JVMが他の非デーモンスレッドが存在しない場合にのみシャットダウンすることを除いて、通常のスレッドと同じです。デーモンスレッドは通常、アプリケーションのサービスを実行するために使用されます。


5

Javaのデーモンスレッドは、バックグラウンドで実行され、ガベージコレクションやその他のハウスキーピングタスクなどのバックグラウンドタスクを実行するためにJVMによって作成されるスレッドです。

注意点:

  1. Javaでメインメソッドを実行するメインスレッドによって作成されたスレッドは、デフォルトでは非デーモンです。これは、スレッドが親スレッドを作成するスレッドからデーモンの性質を継承し、メインスレッドが非デーモンスレッドであるため、メインスレッドから作成される他のスレッドがsetDaemon(true)を呼び出して明示的にデーモンを作成するまで、非デーモンのままにします。

  2. Thread.setDaemon(true)はスレッドデーモンを作成しますが、Javaでスレッドを開始する前にのみ呼び出すことができます。対応するスレッドが既に開始され、実行されている場合は、IllegalThreadStateExceptionをスローします。

Javaのデーモンスレッドと非デーモンスレッドの違い:

1)JVMは、存在する前にデーモンスレッドが完了するのを待ちません。

2)JVMが終了するとき、デーモンスレッドはユーザースレッドとは異なる方法で処理され、最終的にブロックは呼び出されず、スタックは巻き戻されず、JVMは単に終了します。


5

Javaでは、デーモンスレッドは、Java仮想マシン(JVM)の終了を妨げないスレッドのタイプの1つです。デーモンスレッドの主な目的は、特に定期的な定期的なタスクまたは作業の場合に、バックグラウンドタスクを実行することです。JVMが終了すると、デーモンスレッドも停止します。

を設定するthread.setDaemon(true)と、スレッドはデーモンスレッドになります。ただし、この値はスレッドの開始前にのみ設定できます。


それを行う他のタイプのスレッドは何ですか?A:なし。デーモンスレッドと非デーモンスレッド、ピリオドがあります。バイナリ、2つの状態です。
ローンの侯爵

5

ユーザースレッドが存在しないために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

4

デーモンスレッドは、誰もが説明したように、JVMを終了するように制限しないので、基本的に、終了の観点から見ると、アプリケーションにとってハッピーなスレッドです。

サードパーティのサーバーやJMSにデータをプッシュするようなAPIを提供しているときにデーモンスレッドを使用できるようにしたい場合は、クライアントのJVMレベルでデータを集約してから、別のスレッドでJMSに送信する必要があるかもしれません。これがサーバーにプッシュされる必須データでない場合は、このスレッドをデーモンスレッドとして作成できます。この種のデータは、ログプッシュ/集約のようなものです。

よろしく、マニッシュ


Javaでデーモンスレッドを表示する簡単なプログラムを次に示します。journaldev.com/1072/java-daemon-thread-example
Pankaj

4

デーモンスレッドは、リソースの管理を担当するデーモンプロセスに似ています。デーモンスレッドは、ユーザースレッドを提供するためにJava VMによって作成されます。UNIXの更新システムの例、unixはデーモンプロセスです。デーモンスレッドの子は常にデーモンスレッドであるため、デフォルトではデーモンはfalseです。「isDaemon()」メソッドを使用して、デーモンまたはユーザーとしてスレッドを確認できます。したがって、デーモンスレッドまたはデーモンプロセスは、基本的にリソースの管理を担当します。たとえば、jvmを起動すると、ガベージコレクターが実行されます。これは、優先度が1で最も低いデーモンスレッドで、メモリを管理しています。ユーザースレッドが有効である限り、jvmは有効です。uはデーモンスレッドを強制終了できません。jvmはデーモンスレッドを強制終了します。


非常に混乱しており、すべての「そう」は非分離型です。
ローン侯爵

3

コードでのみ実際の例を使って話しましょう。私は上記の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

3

デーモンスレッドは一般に「サービスプロバイダー」スレッドとして知られています。これらのスレッドは、プログラムコードではなくシステムコードの実行に使用する必要があります。これらのスレッドはコードと並行して実行されますが、JVMはいつでもスレッドを強制終了できます。JVMがユーザースレッドを検出しない場合、JVMはそれを停止し、すべてのデーモンスレッドは即座に終了します。次のコマンドを使用して、デーモン以外のスレッドをデーモンに設定できます。

setDaemon(true)

3
これらは「一般に「サービスプロバイダー」スレッドとして知られています」ではありません。
ローン侯爵

1
また、これらを使用して任意のコードを実行できます。JVMは、「彼らに任意の時間を殺す」ことはできませんが、それはします実行中の非デーモンスレッドが存在しないときにそれらを殺します。
ローンの侯爵

@EJPたぶん私は間違っているかもしれませんが、デーモン以外のスレッドが実行されていると、「それはそれらを殺します」。スレッドがデーモンの場合、完全に実行されてOSレベルで管理されるようになるまで、jvmを保持して個別に実行されていませんか?
89n3ur0n 2017年

デーモン以外のすべてのスレッドが終了したときにピコ秒ではなく、それらを強制終了します。確かに「いつでも」ではない。
ローンの侯爵

3

デーモンスレッドは、プロセスの他の非デーモンスレッドがまだ実行されている限り、バックグラウンドで実行されるスレッドです。したがって、すべての非デーモンスレッドが完了すると、デーモンスレッドは終了します。非デーモンスレッドの例は、メインを実行しているスレッドです。スレッドは、setDaemon()、スレッドが開始される前にメソッドを

詳細情報:Javaのデーモンスレッド


2

私にとって、デーモンスレッドは、ユーザースレッドのハウスキーパーのようなものです。すべてのユーザースレッドが終了した場合、デーモンスレッドにはジョブがなく、JVMによって強制終了されます。YouTubeの動画で説明しました。


2

JVMは、最後の非デーモンスレッドの実行が完了すると、作業を完了します。デフォルトでは、JVMはスレッドを非デーモンとして作成しますが、methodを使用してスレッドをデーモンとして作成できますsetDaemon(true)。デーモンスレッドの良い例は、すべての非デーモンスレッドが完了するとすぐに作業を完了するGCスレッドです。


どのようにしてGCスレッドが機能するのでしょうか?プログラムのメインスレッドに非常に長い時間がかかっても(メインスレッドが終了しない)、ガベージコレクションは実行されませんか?
Calicoder

先ほど触れたように、GCスレッドは最後のNONデーモンスレッドの最後まで実行され、実行されます。私たちが知っているように、プログラムのメインスレッドはデーモンではないので、メインスレッドが完了または終了すると、GCスレッドが作業を実行します。基本的に、プロセスが完了するとデーモンスレッドが終了し、すべての非デーモンスレッドが実行されるとプロセスが完了すると言いたいのです。
アルマントゥマンヤン

デフォルトでは、スレッドのデーモンステータスはその親から継承されます。
ローン侯爵

-1

デーモンスレッドは、作成者スレッドが終了すると終了します。

非デーモンスレッド(デフォルト)は、メインスレッドよりも長く存続できます。

if ( threadShouldDieOnApplicationEnd ) {
    thread.setDaemon ( true );
}
thread.start();

これは間違っています。それはクリエータースレッドについてではありません。ユーザー以外のスレッドが実行されている場合、デーモンスレッドは引き続き実行されます。これは、デーモンスレッドを生成するフォアグラウンドスレッドを作成することで簡単にテストできます。フォアグラウンドスレッドがjoin編集された後でも、メインスレッドが実行されている限り、デーモンは残ります。
Hubert Grzeskowiak

デーモンスレッドは、JVMが実行可能な非デーモンスレッドでなくなると停止します。Javadocを参照してください。答えは完全に間違っています。
ローン侯爵
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.