2 분 소요

스레드 그룹 이용하기

여러 스레드를 이용해야 하는 경우

수십개 이상의 스레들을 동시에 멈추게 하려면?

package javastudy;

public class Proagram8 {

	public static void main(String[] args) {

		Runnable subMain = new Runnable() {

			@Override
			public void run() {
				print();
			}
		};
		// 스레드 그룹

		ThreadGroup thGroup = new ThreadGroup("print main group");

		Thread th1 = new Thread(thGroup, subMain);
		th1.setName("sub1");

		Thread th2 = new Thread(thGroup, subMain);
		th2.setName("sub2");

		Thread th3 = new Thread(thGroup, subMain);
		th3.setName("sub3");

		Thread th4 = new Thread(thGroup, subMain);
		th4.setName("sub4");

		Thread th5 = new Thread(thGroup, subMain);
		th5.setName("sub5");
		Thread th6 = new Thread(thGroup, subMain);
		th6.setName("sub6");

		th1.start(); // 꼭 있어야 한다
		th2.start(); // 꼭 있어야 한다
		th3.start(); // 꼭 있어야 한다
		th4.start(); // 꼭 있어야 한다
		th5.start(); // 꼭 있어야 한다
		th6.start(); // 꼭 있어야 한다

		Thread th = Thread.currentThread();
		th.setName("Main");

//		print();

//		try {
//			Thread.sleep(2000);
//		} catch (InterruptedException e) {
//
//			e.printStackTrace();
////
////		}
		thGroup.list(); //그룹에 있는 목록들을 포함 할 수 있다
		thGroup.interrupt();


// interrupt를 걸고 싶으면 일일이 걸거나 반복문을 걸거나 한다 -> 스레드 그룹을 사용
//		if (th1.isAlive())
//			th1.interrupt();
//		if (th2.isAlive())
//			th2.interrupt();
//		if (th3.isAlive())
//			th3.interrupt();
//		if (th4.isAlive())
//			th4.interrupt();
//		if (th5.isAlive())
//			th5.interrupt();
//		if (th6.isAlive())
//			th6.interrupt();

		System.out.println("=====exit=====");
	}

	private static void print() {

		Thread th = Thread.currentThread();

		for (int i = 0; i < 100; i++) {

			if (th.isInterrupted()) {
				System.err.println("요청이 들어와서 종료함");
				return;
			}

			try {
				Thread.sleep(20);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				System.err.println("자다가깨서 종료함."); // 자고있는데 interrupt가 처리해서 깨움
				return;

			}

			// 메인일 경우 다르게 호출하고 싶을경우

			if (th.getName().equals("Main"))
				System.out.printf("<%s[%d] : %d\n", th.getName(), th.getId(), i + 1);
			else
				System.out.printf("%s[%d] : %d\n", th.getName(), th.getId(), i + 1);
		}

	}
}

java.lang.ThreadGroup[name=print main group,maxpri=10] //interrupt하기전의 상태
    Thread[sub1,5,print main group]//스레드 5로 되어있고 포함되는 그룹이 나옴
    Thread[sub2,5,print main group]
    Thread[sub3,5,print main group]
    Thread[sub4,5,print main group]
    Thread[sub5,5,print main group]
    Thread[sub6,5,print main group]
자다가깨서 종료함.
자다가깨서 종료함.
자다가깨서 종료함.
자다가깨서 종료함.
자다가깨서 종료함.
=====exit=====
자다가깨서 종료함.


그룹을 통해서 현재 활성되어있는 스레드의 개수나 활동적인 그룹의 갯수를 알 수있다(그룹을 중첩도 가능하다)


		// 스레드 그룹

		ThreadGroup thGroup = new ThreadGroup("print main group");
		ThreadGroup thGroup1 = new ThreadGroup(thGroup, "print sub group");
		ThreadGroup thGroup2 = new ThreadGroup(thGroup, "print sub group");// 계층이 생김 thGroup에 포함>thGroup1,2

		Thread th1 = new Thread(thGroup, subMain);
		th1.setName("sub1");

		Thread th2 = new Thread(thGroup1, subMain);
		th2.setName("sub2");

		Thread th3 = new Thread(thGroup2, subMain);
		th3.setName("sub3");

		Thread th4 = new Thread(thGroup2, subMain);
		th4.setName("sub4");

		Thread th5 = new Thread(thGroup, subMain);
		th5.setName("sub5");
		Thread th6 = new Thread(thGroup, subMain);
		th6.setName("sub6");


java.lang.ThreadGroup[name=print main group,maxpri=10]
    Thread[sub1,5,print main group]
    Thread[sub5,5,print main group]
    Thread[sub6,5,print main group]
    java.lang.ThreadGroup[name=print sub group,maxpri=10]
        Thread[sub2,5,print sub group]
    java.lang.ThreadGroup[name=print sub group,maxpri=10]
        Thread[sub3,5,print sub group]
        Thread[sub4,5,print sub group]
자다가깨서 종료함.
자다가깨서 종료함.
자다가깨서 종료함.
=====exit=====
자다가깨서 종료함.
자다가깨서 종료함.
자다가깨서 종료함.


계층이 만들어지면 따로 관리할 수 있다

전체를 대상으로 해서 관리를 하는것이 아니라

그쪽만 interrupt가 가능하기도 하고 전체를 대상으로 정보를 뽑을 수 있다 그룹핑된 정보를 끼리끼리 관리 할 수있다

카테고리:

업데이트:

댓글남기기