☕ Ex01.java
Thread thr1 = new Thread(() -> {});
// 💡 따로 그룹을 지정해주지 않은 쓰레드
// - main 쓰레드그룹에 속함
ThreadGroup mainThrGroup = thr1.getThreadGroup();
String mainThrGroupName = mainThrGroup.getName();
// 💡 쓰레드 그룹 직접 생성하기
ThreadGroup threadGroup1 = new ThreadGroup("TG_1");
String thrGroup1Name = threadGroup1.getName();
// 💡 그룹에 속한 쓰레드를 만드는 생성자
Thread thr2 = new Thread(threadGroup1, () -> {});
String thr2GroupName = thr2.getThreadGroup().getName();
// 💡 또 다른 쓰레드 그룹에 속한 쓰레드 그룹 만들기
ThreadGroup threadGroup2 = new ThreadGroup(threadGroup1, "TG_2");
String thrGroup2ParentName = threadGroup2.getParent().getName();
☕ PrintThread.java
public class PrintThread implements Runnable {
static int lastNo = 0;
String groupName;
int no;
public PrintThread(String groupName) {
this.groupName = groupName;
this.no = ++lastNo;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
System.out.printf("[%s] %d%n", groupName, no);
} catch (InterruptedException e) {
System.out.printf("🛑 %s 종료%n", groupName);
return;
}
}
}
}
☕ Ex02.java
ThreadGroup groupA = new ThreadGroup("A");
ThreadGroup groupB = new ThreadGroup("B");
ThreadGroup groupBB = new ThreadGroup(groupB, "BB");
ThreadGroup groupC = new ThreadGroup("C");
for (ThreadGroup tg : new ThreadGroup[] { groupA, groupB, groupBB, groupC }) {
for (int i = 0; i < 3; i++) {
new Thread(tg, new PrintThread(tg.getName())).start();
}
}
try (Scanner sc = new Scanner(System.in)) {
while (sc.hasNext()) {
String line = sc.nextLine();
if (line.length() == 1) {
ThreadGroup[] groups = new ThreadGroup[] {
groupA, groupB, groupC
};
if ("abc".contains(line)) {
ThreadGroup group = groups["abc".indexOf(line)];
// 💡 그룹의 현황 파악
// - 다른 메소드들도 살펴볼 것
System.out.printf(
"%s : %d / %d%n",
group.getName(),
group.activeCount(),
// 내부의 쓰레드들이 멈춰도 active로 카운트
group.activeGroupCount()
);
}
if ("ABC".contains(line)) {
// 그룹 일괄 종료
ThreadGroup group = groups["ABC".indexOf(line)];
group.interrupt();
}
}
if (line.equalsIgnoreCase("quit")) break;
}
}