Javaデーモンスレッドと非デーモンスレッドの説明
2516 ワード
JavaにはUser Thread(ユーザスレッド)、Daemon Thread(デーモンスレッド)の2種類のスレッドがあります.
1)、thread.setDaemon(true)はthread.start()の前に設定する必要があります.そうしないと、IllegalThreadStateException例外が飛び出します.実行中の通常のスレッドをデーモンスレッドに設定することはできません.(備考:この点はデーモンプロセスと明らかな違いがあり、デーモンプロセスは作成後、プロセスを元のセッションの制御から解放する+プロセスを元のプロセスグループの制御から解放する+プロセスを元の制御端末の制御から解放する;だから仮想機に託す言語メカニズムとシステムレベルの言語には本質的な違いがある)
2)、Daemonスレッドで生成された新しいスレッドもDaemonである.(この点はまた本質的な違いがある:デーモンfork()からのサブプロセスはデーモンプロセスではなく、親プロセスに関する情報をコピーしたにもかかわらず、サブプロセスの親プロセスはinitプロセスではなく、いわゆるデーモンプロセスは本質的に「親プロセスが停止し、initが養子縁組され、ファイル0,1,2が/dev/nullであり、現在のディレクトリは/」)
3)、すべてのアプリケーションがDaemonスレッドに割り当てられてサービスを行うことができるわけではありません.例えば、読み書き操作や計算ロジックなどです.Daemon Threadがまだ来ていない場合や操作を行っている場合、仮想マシンはすでに終了している可能性があります.
例:
//ファイル出力のデーモンスレッドタスクの完了
import java.io.*;
class TestRunnable implements Runnable{
}
public class TestDemo2{
}
実行結果:ファイルdaemon.txtに「daemon」文字列はありません.
しかしthread.setDaemon(true);//デーモンスレッドコメントを設定します.ファイルdaemon.txtはdaemon文字列に書き込むことができます.
JREは,プログラムの実行が終了したか否かを判断する基準として,バックグラウンドスレッドの状態にかかわらず,すべてのフロントスレッド行が終了したことであるため,バックグラウンドスレッドを使用する際にはこの問題に注意しなければならない.
しかし、daemon Threadは実際に応用されていますか?例えば、webサーバのサーブレットは、コンテナの起動時にバックグラウンドでサービススレッド、すなわちスケジューリングスレッドを初期化し、httpリクエストの処理を担当し、各リクエストがスレッドプールから作業者スレッドを取り出してリクエストを処理し、同時制御の目的を実現する.
Unix Java , , , Java JVM , Java , , Unix , JVM , 。
Daemon , GC 。 User Thread Daemon Thread , : User Thread , Daemon Thread , 。
, , :public final void setDaemon(boolean on) ; :
1)、thread.setDaemon(true)はthread.start()の前に設定する必要があります.そうしないと、IllegalThreadStateException例外が飛び出します.実行中の通常のスレッドをデーモンスレッドに設定することはできません.(備考:この点はデーモンプロセスと明らかな違いがあり、デーモンプロセスは作成後、プロセスを元のセッションの制御から解放する+プロセスを元のプロセスグループの制御から解放する+プロセスを元の制御端末の制御から解放する;だから仮想機に託す言語メカニズムとシステムレベルの言語には本質的な違いがある)
2)、Daemonスレッドで生成された新しいスレッドもDaemonである.(この点はまた本質的な違いがある:デーモンfork()からのサブプロセスはデーモンプロセスではなく、親プロセスに関する情報をコピーしたにもかかわらず、サブプロセスの親プロセスはinitプロセスではなく、いわゆるデーモンプロセスは本質的に「親プロセスが停止し、initが養子縁組され、ファイル0,1,2が/dev/nullであり、現在のディレクトリは/」)
3)、すべてのアプリケーションがDaemonスレッドに割り当てられてサービスを行うことができるわけではありません.例えば、読み書き操作や計算ロジックなどです.Daemon Threadがまだ来ていない場合や操作を行っている場合、仮想マシンはすでに終了している可能性があります.
例:
//ファイル出力のデーモンスレッドタスクの完了
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はdaemon文字列に書き込むことができます.
JREは,プログラムの実行が終了したか否かを判断する基準として,バックグラウンドスレッドの状態にかかわらず,すべてのフロントスレッド行が終了したことであるため,バックグラウンドスレッドを使用する際にはこの問題に注意しなければならない.
しかし、daemon Threadは実際に応用されていますか?例えば、webサーバのサーブレットは、コンテナの起動時にバックグラウンドでサービススレッド、すなわちスケジューリングスレッドを初期化し、httpリクエストの処理を担当し、各リクエストがスレッドプールから作業者スレッドを取り出してリクエストを処理し、同時制御の目的を実現する.