JAvaスレッドグループThreadGroup

6163 ワード

一、スレッド組合せスレッドプールの異同:
≪スレッド・グループ|Thread Group|emdw≫:スレッド・グループが存在する意味.主な原因はセキュリティです.JAvaのデフォルトで作成されるスレッドはすべてシステムスレッドグループに属し、同じスレッドグループのスレッドは互いに相手のデータを変更することができます.ただし、異なるスレッド・グループでは、「スレッド・グループ間」でデータを変更することはできず、データのセキュリティをある程度保証できます.スレッドプール:スレッドプールの存在意義、最も重要な役割は効率です.スレッドの作成と終了には、システム時間がかかります.(特に作成)スレッドの作成と削除を続けると時間がかかりません.したがって、スレッドを作成してタスクを完了した後に終了せずにスリープ状態にし、必要に応じて起動すると、一定の時間を節約できます.このようなスレッドが多い場合は、スレッドプールを使用して管理できます.効率性を確保します.. スレッドグループとスレッドプールの共通の特徴:1、すべて一定数のスレッドを管理する2、すべてスレッドに対して制御することができます---休眠、起動、終了、作成、中断(一時停止)--しかし、必ずしもこれらの操作をすべて含まない.
二、まとめ:
Javaでは、各スレッドがスレッドグループ(ThreadGroup)に属します.たとえば、main()でスレッドが生成された場合、このスレッドはmainスレッドグループ管理のメンバーに属します.次のコマンドを使用して、現在のスレッドが属するスレッドグループ名を取得できます.
Thread.currentThread().getThreadGroup().getName();
1つのスレッドが生成されると、あるスレッドグループに分類され、視線距離はどのスレッドグループで生成されるかによって決まります.指定されていない場合は、サブスレッドを生成するスレッドグループに分類されます.スレッドグループを自分で指定することもできます.スレッドがグループに分類されると、グループを交換できません.        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(threadGroup2, "group2's member");
     
ThreadGroupのいくつかの方法は、interrupt()メソッドがinterruptスレッドグループ内のすべてのスレッドをinterrupt()メソッドが持つことができ、setMaxPriority()メソッドは、スレッドグループ内のスレッドが持つことができる最高優先度(本来より高い優先度を持つスレッドは影響を受けない)を設定することができます.スレッドグループ内のすべてのスレッドを一度に取得して何らかの操作を行う場合は、enumerate()メソッドを使用します.たとえば、次のようにします.
Thread[] threads = new Thread[threadGroup1.activeCount()]; threadGroup1.enumerate(threads);
ThreadGroupにはuncaughtException()メソッドがあります.スレッドグループ内のスレッドにUnchecked exception例外が発生した場合、実行環境によってこのメソッドが呼び出され、必要に応じてメソッドを再定義できます.次の例を参照してください.
package onlyfun.caterpillar; public class ThreadGroup Demo{public static void main(String[]args){ThreadGroup threadGroup 1=//匿名クラス表記new ThreadGroup("group 1")//ThreadGroupを継承し、次のメソッドを再定義//スレッドメンバーからunchecked exceptionを投げ出す//このメソッドpublic void uncaughtException(Thread t,Throwable e){System.out.println(t.getName()+「:」+e.getMessage();    } };//匿名系書き方Thread thread 1=//このスレッドはthreadGroup 1の一員であるnew Thread(threadGroup 1,new Runnable(){public void run()/unchecked異常throw new RuntimeException("テスト異常");    } });   thread1.start();     } }
  
uncaughtException()メソッドのパラメータでは、最初のパラメータは例外が発生したスレッドのインスタンスを取得し、2番目のパラメータは例外オブジェクトを取得し、例にはスレッドの名前と例外情報が表示されます.三、サンプルコードを添付する:
public class TestThreadGroup {

	static class MyThread extends Thread {

		@Override
		public void run() {
			ThreadGroup currentThreadGroup = Thread.currentThread()
					.getThreadGroup();
			System.out.println(currentThreadGroup.getName() + ","
					+ currentThreadGroup.getParent().getName());

			System.out.println(getName() + "," + getId() + ","
					+ Thread.currentThread().getName());

			System.out.println(Thread.currentThread().getState());

			// if(Thread.currentThread().getState()==Thread.State.RUNNABLE)
			{

			}
			// super.run();
		}
	}

	public static void main(String[] args) throws Exception {

		new MyThread().start();
		// ThreadGroup currentThreadGroup=Thread.currentThread().getThreadGroup();
		// System.out.println(currentThreadGroup.getName()+","+currentThreadGroup.getParent().getName());
		 test001();
		ThreadGroup sys = Thread.currentThread().getThreadGroup().getParent();
		// sys.list(); // (1)
		// System.out.println(JSON.toJSONString(sys));
		//test002();

	}

	private static void test002() throws InterruptedException {
		//        。
		ThreadGroup tg = new ThreadGroup("group 1");

		//        10   。
		for (int i = 0; i < 10; i++) {
			Thread th = new Thread(tg, new TestRunnable(), "thread_" + i);
			th.start();
		}

		//   2 。
		Thread.sleep(2000);
		//       。
		tg.interrupt();
		//   
		System.out.println(tg.activeCount());
	}

	private static class TestRunnable implements Runnable {
		@Override
		public void run() {
			String thName = Thread.currentThread().getName();
			System.out.printf("'%s' started. 
", thName); while (!Thread.currentThread().isInterrupted()) { } System.out.printf("'%s' ended.
", thName); } } // ThreadGroup private static void test001() { // ThreadGroup group=new ThreadGroup("group"); // Thread thread=new Thread(group,"the first thread of group"); // ThreadGroup threadGroup1 = new ThreadGroup("group1") { // ThreadGroup // unchecked exception // public void uncaughtException(Thread t, Throwable e) { System.out.println(t.getName() + ": " + e.getMessage()); } }; // // threadGroup1 Thread thread1 = new Thread(threadGroup1, new Runnable() { public void run() { // unchecked throw new RuntimeException(" fuck"); } }); thread1.start(); } }
// How threads can access other threads in a parent thread group
public class TestAccess {
	
	public static void main(String[] args) {
		ThreadGroup x = new ThreadGroup("x"),
		y = new ThreadGroup(x, "y"), 
		z = new ThreadGroup(y, "z");
		
		Thread one = new TestThread1(x, "one"), 
		two = new TestThread2(z, "two");
	}
}

class TestThread1 extends Thread {
	private int i;

	TestThread1(ThreadGroup g, String name) {
		super(g, name);
	}

	void f() {
		i++; // modify this thread
		System.out.println(getName() + " f()");
	}
}

//    1
class TestThread2 extends TestThread1 {
	
	TestThread2(ThreadGroup g, String name) {
		super(g, name);
		start();
	}

	
	public void run() {
		//  ThreadGroup            
		ThreadGroup g = getThreadGroup().getParent().getParent();
		//       
		g.list();
		
		
		Thread[] gAll = new Thread[g.activeCount()];//       
		//        
		g.enumerate(gAll);
		for (int i = 0; i < gAll.length; i++) {
			gAll[i].setPriority(Thread.MIN_PRIORITY);
			((TestThread1) gAll[i]).f();
		}
		//       
		g.list();
	}
}