자바

JAVA Thread 자바 스레드 : 스레드 그룹 이름 얻기 / 스레드 그룹 생성 / 스레드 그룹의 일괄 inerrupt() /// 스레드 그룹 생성 / 스레드 그룹의 일괄 inerrupt()

알통몬_ 2017. 3. 15. 11:18
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

스레드 그룹

 관련된 스레드를 묶어서 관리할 목적으로 이용됩니다. JVM이 실행되면 system 스레드 그룹을 만들고 JVM운영에 필요한 스레드들을 생성해서 system 스레드 그룹에 포함시킵니다. 그리고 system의 하위 스레드 그룹으로 main을 만들고 메인 스레드를 main 스레드 그룹에 포함시킵니다. 

스레드는 반드시 하나의 스레드 그룹에 포함되는데 명시적으로 스레드 그룹에 포함시키지 않으면 

기본적으로 자신을 생성한 스레드와 같은 스레드 그룹에 속하게 됩니다. 

일반적으로 작업 스레드는 대부분 main 스레드가 생성하므로 

기본적으로 main 스레드 그룹에 속합니다.


스레드 그룹 이름 얻기

 현재 스레드가 속한 그룹의 이름을 알고 싶다면 =>

ThreadGroup group = Thread.currentThread.getThreadGroup();

String groupName = group.getName();


Thread 의 static 메서드인 getAllStackTraces() 를 이용하면 프로세스 내에서 실행하는 

모든 스레드에 대한 정보를 얻을 수 있습니다.

Map<Thread, StackTraceElement[]> Map = Thread.getAllStackTraces();


getAllStackTraces() 메서드 : Map 타입의 객체를 리턴. 

키는 스레드 객체이고 값은 스레드의 상태 기록들을 갖고 있는 StackTraceElement[] 배열입니다. 


예제)

import java.util.Map;

import java.util.Set;


public class ThreadInfoExample {

public static void main(String[] args) {

AutoSaveThread autoSaveThread = new AutoSaveThread();

autoSaveThread.setName("AutoSaveThread");

autoSaveThread.setDaemon(true);

autoSaveThread.start();

Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();

Set<Thread> threads = map.keySet(); // 프로세스에서 실행하는 모든 Thread를 

                                                            가져오는 코드라는 것만 알아두면 되겠습니다.

for(Thread thread : threads) {

System.out.println("Name: " + thread.getName() + ((thread.isDaemon())?"(데몬)": "(주)"));

System.out.println("\t" + "소속그룹: " + thread.getThreadGroup().getName());

System.out.println();

}

}

 

}



==========================================================================================




스레드 그룹 생성

 스레드 그룹을 만들고 싶을 때는 아래 생성자 중에 하나를 골라 ThreadGroup 객체를 만들 수 있음. ThreadGroup 이름만 주거나, 부모 ThreadGroup과 이름을 매개값으로 줄 수 있습니다.

ThreadGroup tg = new ThreadGroup(String name);

ThreadGroup tg = new ThreadGroup(ThreadGroup parent, String name);


스레드 그룹 생성시 부모 스레드 그룹을 지정하지 않으면 현재 스레드가 속한 그룹의 위 그룹으로 생성됩니다. main 스레드가 ThreadGroup(String name)을 이용해서 새로운 스레드 그룹을 생성하면 main 스레드 그룹의 하위 스레드 그룹이 됩니다.

스레드 그룹을 생성한 후 이 그룹에 스레드를 포함시커려면 Thread 객체를 생성할 때 

생성자 매개값으로 스레드 그룹을 지정하면 됩니다. 

스레드 그룹을 매개값으로 갖는 Thread 생성자는 아래 네가지가 있습니다.

Thread t = new Thread(ThreadGroup group, Runnable target);

Thread t = new Thread(ThreadGroup group, Runnable target, String name);

Thread t = new Thread(ThreadGroup group, Runnable target, String name, long stackSize);

Thread t = new Thread(ThreadGroup group, String name);


Runnable 타입의 target은 Runnable 구현 객체이고 ,String 타입의 name은 스레드 이름입니다.

long 타입의 stackSize는 JVM이 이 스레드에 할당할 stack 크기입니다.



스레드 그룹의 일괄 interrupt()

 스레드 그룹에서 제공하는 interrupt() 메서드를 이용하면 그룹 내에 포함된 모든 스레드들을 일괄 interrupt()할 수 있습니다.  5개의 스레드들이 같은 그룹에 소속되어 있다면 

스레드 그룹의 interrupt() 메서드를 한 번만 호출해주면 됩니다. 

스레드 그룹의 interrupt() 메서드는 포함된 모든 스레드의 interrupt() 메서드를 내부적으로 호출해주기 때문입니다.


스레드 그룹의 interrupt() 메서드는 소속된 스레드의 interrupt() 메서드를 호출만 합니다. 

안전한 종료를 위해서 개별 스레드 예외처리를 해야합니다.


아래는 ThreadGroup이 가지고 있는 주요 메서드들입니다.

메서드                                   설명

int             activeCount()            현재 그룹 및 하위 그룹에서 활동 중인 모든 스레드의 수를

                                          리턴한다.

----------------------------------------------------------------------------

int             activeGroupCount()     현재 그룹에서 활동 중인 모든 하위 그룹의 수를 리턴한다.

----------------------------------------------------------------------------

void           checkAccess()          현재 스레드가 스레드 그룹을 변경할 권한이 있는지 체크한다.                                             만약 권한이 없으면 SecurityException을 발생시킵니다.

----------------------------------------------------------------------------

void           destroy()                 현재 그룹 및 하위 그룹을 모두 삭제한다. 단 그룹 내에

                                          포함된 모든 스레드들이 종료 상태가 되어야 한다.

----------------------------------------------------------------------------

boolean      isDestroyed()             현재 그룹이 삭제되었는지 여부를 리턴한다.

----------------------------------------------------------------------------

int            getMaxPriority()           현재 그룹에 포함된 스레드가 가질 수 있는 최대 우선 순위를 

                                           리턴한다.

----------------------------------------------------------------------------

void            getMaxPriority(int pri)   현재 그룹에 포함된 스레드가 가질 수 있는 최대 우선순위를

                                           설정한다.

----------------------------------------------------------------------------

String          getName()               현재 그룹의 이름을 리턴한다.

----------------------------------------------------------------------------

ThreadGroup  getParent()               현재 그룹의 부모 그룹을 리턴한다.

----------------------------------------------------------------------------

boolean        parentOf(ThreadGroup tg)  현재 그룹이 매개값으로 지정한 스레드 그룹의 부모인지

                                                여부를 리턴한다.

----------------------------------------------------------------------------

boolean        isDaemon()                  현재 그룹이 데몬 그룹인지 여부를 리턴한다.

----------------------------------------------------------------------------

void            setDaemon(boolean daemon)  현재 그룹을 데몬 그룹으로 설정한다.

----------------------------------------------------------------------------

void            list()          현재 그룹에 포함된 스레다와 하위 그룹에 대한 정보를 출력한다.

----------------------------------------------------------------------------

void            interrupt()     현재 그룹에 포함된 모든 스레드들을 interrupt 한다.

----------------------------------------------------------------------------


아래 예제는 스레드 그룹을 생성하고 정보를 출력해준 후 3초뒤 스레드 그룹의 interrupt() 메서드를 호출해서 수레드 그룹에 포함된 모든 스레드들을 종료시킵니다.

예제)

public class WorkThread extends Thread {

public WorkThread(ThreadGroup threadGroup, String threadName) {

super(threadGroup, threadName);

}

@Override

public void run() {

while(true) {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

System.out.println(getName() + " interrupted");

break;

}

}

System.out.println(getName() + " 종료됨");

}

 

}


실행 클래스)

public class ThreadGroupExample {

public static void main(String[] args) {

ThreadGroup myGroup = new ThreadGroup("myGroup");

WorkThread workThreadA = new WorkThread(myGroup, "workThreadA");

WorkThread workThreadB = new WorkThread(myGroup, "workThreadB");

workThreadA.start();

workThreadB.start();

System.out.println("[ main 스레드 그룹의 list() 메소드 출력 내용 ]");

ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();

mainGroup.list();

System.out.println();

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

}

System.out.println("[ myGroup 스레드 그룹의 interrupt() 메소드 호출 ]");

myGroup.interrupt();

}

 

}



반응형