ホームページ  >  記事  >  Java  >  Javaのデーモンスレッドと非デーモンスレッドの分析例

Javaのデーモンスレッドと非デーモンスレッドの分析例

黄舟
黄舟オリジナル
2017-10-14 09:37:111196ブラウズ

この記事では主に Java のデーモン スレッドと非デーモン スレッドを紹介します。編集者がそれを参考にさせていただきます。エディターをフォローして見てみましょう

最近、Java の基本的な知識を勉強しましたが、Java のスレッド機構を比較すると、これまであまりにも多くの知識が無視されていたことがわかりました。 Java には 2 種類のスレッドがあります。 ユーザー スレッド (ユーザー スレッド)。 、デーモン スレッド (デーモン スレッド)、(PS: 以前は無視されました)。

Unix 開発を学んだことはあっても、Java について詳しく学んだことがない学生は混乱すると予想されます。オペレーティング システムにはいわゆるデーモン スレッドの概念はなく、デーモン プロセスのみが存在します。しかし、Java 言語のメカニズムは、これは、Java プラットフォームがオペレーティング システムの最下層を保護することを意味します。そのため、Java プラットフォームは、独自の仮想プラットフォーム内で自分にとって有益なメカニズムを構築でき、言語またはプラットフォームの設計者は多かれ少なかれインスピレーションを受けます。 Unix のアイデアが影響し、デーモン スレッドのメカニズムが JVM などのプラットフォームに適しているため、デーモン スレッドが誕生しました。

デーモンの役割は、GC スレッドなどの他のスレッドを実行するためのサービスを提供することです。実際、ユーザー スレッドのスレッドとデーモン スレッドのデーモン スレッドには本質的に違いはありません。唯一の違いは、仮想マシンの離脱です。すべてのユーザー スレッドが退避すると、デーモン スレッドにはサービスを提供するスレッドがなくなるため、仮想マシンは停止します。も出る。

デーモン スレッドは仮想マシン内に提供されていません。メソッドは public Final void setDaemon(boolean on); ですが、いくつか注意点があります。 thread.setDaemon(true) thread.start() の前に設定する必要があります。設定しないと、IllegalThreadStateException がスローされます。実行中の通常のスレッドをデーモン スレッドに設定することはできません。 (注: これは明らかにデーモン プロセスとは異なります。デーモン プロセスが作成されると、プロセスは元のセッションの制御を取り除くことができ、プロセスは元のプロセス グループの制御を取り除くことができ、プロセスは元の制御端末の制御を取り除き、仮想上に配置します。マシンの言語メカニズムはシステムレベルの言語とは本質的に異なります)

2)。デーモンスレッドで生成される新しいスレッドもデーモンのものです。 (これは重要な違いです。デーモン プロセス fork() から派生した子プロセスはデーモン プロセスではなくなりました。親プロセスのプロセス関連情報はコピーされますが、子プロセスの親プロセスはデーモン プロセスではありません。 init プロセス。いわゆるデーモン プロセスは本質的に、「親プロセスが終了し、init がそれを採用し、ファイル 0、1、2 はすべて /dev/null になり、現在のディレクトリは /」になります

3)、すべてのアプリケーションを割り当てることができるわけではありません。読み取りおよび書き込み操作や計算ロジックなどのサービスを実行するデーモン スレッドを提供します。デーモン スレッドが操作を実行する前に仮想マシンが終了した可能性があるためです。

例:

//完成文件输出的守护线程任务

import java.io.*; 

 

class TestRunnable implements Runnable{ 

  public void run(){ 

        try{ 

         Thread.sleep(1000);//守护线程阻塞1秒后运行 

         File f=new File("daemon.txt"); 

         FileOutputStream os=new FileOutputStream(f,true); 

         os.write("daemon".getBytes()); 

      } 

        catch(IOException e1){ 

     e1.printStackTrace(); 

        } 

        catch(InterruptedException e2){ 

         e2.printStackTrace(); 

      } 

  } 

} 

public class TestDemo2{ 

  public static void main(String[] args) throws InterruptedException 

  { 

    Runnable tr=new TestRunnable(); 

    Thread thread=new Thread(tr); 

        thread.setDaemon(true); //设置守护线程 

    thread.start(); //开始执行分进程 

  } 

}

実行結果: ファイル daemon.txt に「daemon」文字列がありません。

ただし、 thread.setDaemon(true); // デーモンスレッドを設定すると、daemon.txt ファイルをデーモン文字列に書き込むことができます

JRE がプログラムが終了したかどうかを判断する基準は、フロントデスク バックグラウンド スレッドの状態に関係なく、実行スレッドは完了します。そのため、バックグラウンド スレッドを使用する場合は、この問題に注意する必要があります。

しかし、デーモンスレッドの実際のアプリケーションはどこにあるのでしょうか?たとえば、Web サーバーのサーブレットの場合、コンテナーが開始すると、サービス スレッド、つまり http リクエストの処理を担当するスケジューリング スレッドがバックグラウンドで初期化され、その後、リクエストごとにスケジューリング スレッドが実行されます。スレッド プールからワーカー スレッドを取得してリクエストを処理することで、同時実行制御の目的を達成します。

理解を容易にするためにインターネットから取得した写真:

以上がJavaのデーモンスレッドと非デーモンスレッドの分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。