09.스레드 그룹 이용하기
스레드 그룹 이용하기
여러 스레드를 이용해야 하는 경우
수십개 이상의 스레들을 동시에 멈추게 하려면?
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가 가능하기도 하고 전체를 대상으로 정보를 뽑을 수 있다 그룹핑된 정보를 끼리끼리 관리 할 수있다
댓글남기기