(四)スレッド属性

2954 ワード

スレッドのプロパティには、スレッド優先度、デーモンスレッド、スレッドグループ、および未取得の例外を処理するプロセッサが含まれます.1.スレッド優先度Javaプログラミング言語では、各スレッドに優先度があります.デフォルトでは、1つのスレッドは親スレッドの優先度を継承します.優先度をMIN_に設定できますPRIORITY(Threadクラスでは1と定義)とMAX_PRIORITY(10と定義)の間の任意の値.スレッドスケジューラが新しいスレッドを選択する機会があるたびに、まず優先度の高いスレッドを選択します.
注意:
(1)スレッド優先度はシステムに大きく依存する.仮想マシンがホストプラットフォームのスレッド実装メカニズムに依存する場合、JAVAの優先度はホストプラットフォームの優先度にマッピングされ、優先度の個数はより多く、より少ないかもしれない.Windowsには7つの優先順位があります.Linuxでのスレッドの優先度は無視されます.すべてのスレッドに同じ優先度があります.(2)いくつかの優先度の高いスレッドが非アクティブになっていない場合、優先度の低いスレッドは永遠に実行できない可能性がある.2.デーモンスレッドsetDaemon(true):スレッドをデーモンスレッドに変換します.デーモン・スレッドの唯一の役割は、他のスレッドにサービスを提供することです.デーモンスレッドしか残っていない場合、仮想マシンは終了します.注:デーモン・スレッドは、ファイル、データベースなどの固有のリソースにアクセスしないでください.いつでも1つの操作の途中で中断されるからです.e.g.タイミングスレッドは、他のスレッドまたは古いキャッシュエントリのスレッドに「時間バタバタ」信号を送信します.3.異常プロセッサ原因がキャプチャされていない:スレッドのrunメソッドは検出された異常を放出できないが、検出されていない異常はスレッドの終了を招く.この場合、スレッドは死亡します.処理方法:伝播可能な例外を処理するためにcatch句は必要ありません.逆に、スレッドが死亡する前に、異常は異常をキャプチャしていないプロセッサに伝達される.異常をキャプチャしていないプロセッサ:(1).このプロセッサはThread.UncautExceptionHandlerインタフェースを実装したクラスに属する必要があります.このクラスには1つのメソッドvoid uncaughtException(Thread t,Throwable e)(2)しかありません.また、Threadクラスの静的メソッドsetDefaultUncaughtExceptionHandlerを使用して、すべてのスレッドにデフォルトのプロセッサをインストールすることもできます.
public class MyUncaughtExceptionHandler implements UncaughtExceptionHandler {
	@Override
	public void uncaughtException(Thread t, Throwable e) {
		System.out.println("    ");
	}
}
 
Runnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
 
代替プロセッサは、ログAPIを使用して、取得されていない例外のレポートをログファイルに送信することができる.デフォルトのプロセッサがインストールされていない場合、デフォルトのプロセッサ(g e D e f a u l t U n c aughtExceptionHandler)は空です.ただし、独立したスレッドにプロセッサをインストールしない場合は、そのスレッドのThreadGroupオブジェクトになります.注意:スレッドグループは、統一的に管理できるスレッドの集合です.デフォルトでは、作成したすべてのスレッドは同じスレッドグループに属しますが、他のグループも作成される場合があります.Java SE 5.0からスレッド集合の操作により良い特性が導入された.自分のプログラムでスレッドグループを使用しないでください.ThreadGroupクラスは、uncaughtExceptionメソッドを次のように操作します.
    public void uncaughtException(Thread t, Throwable e) {
	if (parent != null) {
	    parent.uncaughtException(t, e);
	} else {
            Thread.UncaughtExceptionHandler ueh = 
                Thread.getDefaultUncaughtExceptionHandler();
            if (ueh != null) {
                ueh.uncaughtException(t, e);
            } else if (!(e instanceof ThreadDeath)) {
		System.err.print("Exception in thread \""
				 + t.getName() + "\" ");
                e.printStackTrace(System.err);
            }
        }
    }
 
(1).スレッドグループに親スレッドグループがある場合,親スレッドグループのuncaughtExceptionメソッドが呼び出される.(2).そうでなければ、Thread.getDefaultExceptionHandlerメソッドが空でないプロセッサを返すと、そのプロセッサが呼び出される(3).そうでなければ、ThrowableがThreadDeathのインスタンスであれば、何もしない.(4).そうでなければ,スレッドの名前とThrowableのスタックトレースがSystem.errに出力される.