Javaスレッド(3)


1.  Javaの各スレッドは、スレッドグループ管理の一員に属します.現在のスレッドが属するスレッドグループ名を取得するには、次の文を使用します.
    
Thread.currentThread().getThreadGroup().getName();

      各スレッドが生成されると、スレッドがそのグループで生成されるかどうかによって、スレッドグループに分類されます.指定されていない場合は、サブスレッドを生成するスレッドグループに分類されます.スレッドグループを自分で指定することもできます.スレッドがグループに分類されると、グループを交換できません.
      JAva.lang.ThreadGroupクラスは、その名前の通り、グループ全体のスレッドを統一的に管理できます.次の方法でグループを生成し、スレッドを生成するときにグループを指定できます.
   
ThreadGroup threadGroup1 = new ThreadGroup("group1");
ThreadGroup threadGroup2 = new ThreadGroup("group2");

Thread thread1 = new Thread(threadGroup1,"group1's member");
Thread thread2 = new Thread(threadGroup1,"group2's member");

     ThreadGroupのいくつかの方法は、すべてのスレッドに作用することができます.例えばinterrupt()メソッドはinterruptグループ内のすべてのスレッドを設定することができ、setMaxPriority()メソッドはグループ内のスレッドが持つことができる最大優先度(本来より優先度を持つスレッドは影響を受けない)を設定することができる.
     グループ内のすべてのスレッドを一度に取得して何らかの操作を行う場合は、enumerate()メソッドを使用します.例:
Thread[] threads = new Thread[threadGroup1.activeCount()];
threadGroup1.enumerate(threads);

    ActiveCount()メソッドは、このスレッドグループ内のアクティブなスレッドの推定数を返します.Enumerate()メソッドは、スレッドオブジェクトを各配列フィールドに設定し、配列インデックスを指定してスレッドを操作するThread配列を入力します.
    ThreadGroupには、グループ内のスレッドに非制御異常が発生した場合に実行環境によって呼び出されるuncaughtException()メソッドがあります.必要であれば、この方法を再定義することができます.次の例を示します.
package ysu.hxy;

import java.io.*;

public class ThreadGroupDemo
{
	public static void main(String[] args)
	{
		ThreadGroup threadGroup1 = 
			//       
		          new ThreadGroup("group1"){
					  //  ThreadGroup         
					  //             
					  //      
					  public void uncaughtException(Thread t,Throwable e)
					  {
						  System.out.println(t.getName() + ":" + e.getMessage());
					  }
		          };

	     //       
		 Thread thread1 = 
			 //    threadGroup1   
			 new Thread(threadGroup1,new Runnable(){
				 public void run(){
					 //  unchecked  
					 throw new RuntimeException("    ");
				 }
			 });
	     thread1.start();
	}
};

  uncaughtException()メソッドのパラメータでは、最初のパラメータは異常が発生したスレッドのインスタンスを取得でき、2番目のパラメータは異常オブジェクトを取得でき、例にはスレッドの名前と異常情報が表示されます.結果は次のとおりです.      Thread-0:テスト異常
2.UncaughtExceptionHandler:J 2 SE 5.0の前に、一部のスレッドの非制御異常を統一的に処理する場合は、ThreadGroupを使用して管理できます.上記の例のように、ThreadGroupを継承した後にuncaughtException()メソッドを再定義します.J 2 SE 5.0以降は、このように面倒なことなく、異常処理クラスにThread.UncaughtExceptionHandlerインタフェースを実現させ、そのuncaughtException()メソッドを実現させることができます.たとえば、前述の例を必ず示します.まず、次のようにクラスを定義して、Thread.UncautExceptionHandlerインタフェース(例外処理クラス)を実装します.
package ysu.hxy;

public class ThreadExceptionHandler implements Thread.UncaughtExceptionHandler
{
   	public void uncaughtException(Thread t,Throwable e)
	{
		System.out.println(t.getName() + ":" + e.getMessage());
	}
}

 メインストリーム・プロシージャは、次のプログラム・コードに書き換えることができます.
package ysu.hxy;

import java.io.*;

public class ThreadGroupDemo2
{
	public static void main(String[] args) 
	{
		//        
		ThreadExceptionHandler handler = 
			new ThreadExceptionHandler();

		ThreadGroup threadGroup1 = new ThreadGroup("group1");

		//       
        Thread thread1 = 
			new Thread(threadGroup1,new Runnable(){
			    public void run(){
					//  unchecked  
					throw new RuntimeException("    ");
				}
		});

		//       
        thread1.setUncaughtExceptionHandler(handler);
		thread1.start();
	}
}