Dico

[Java] ThreadGroup

  • 민갤

쓰레드 그룹 Thread Group

쓰레드를 그룹으로 묶어서 관리할 수 있다.

보안상의 이유로 도입된 개념.

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

사용자가 생성하는 모든 쓰레드 그룹은 main 쓰레드 그룹의 하위 쓰레드 그룹이 된다.

쓰레드 그룹을 지정하지 않고 생성한 쓰레드는 자동적으로 main 쓰레드 그룹에 속하게 된다.

자신이 속한 쓰레드 그룹이나 하위 쓰레드 그룹은 변경할 수 있지만, 다른 쓰레드 그룹의 쓰레드를 변경할 수 없다.

쓰레드 그룹에 다른 쓰레드 그룹을 포함시킬 수 있다.

Public constructors

생성자설명
  ThreadGroup(String name)  지정된 이름의 새로운 쓰레드 그룹을 생성
  ThreadGroup(ThreadGroup parent, String name)  지정된 쓰레드 그룹에 포함되는 새로운 쓰레드 그룹을 생성

Public methods

반환타입이름설명
  int  activeCount()  쓰레드 그룹에 포함된 활성상태에 있는 쓰레드의 수를 반환
  int  activeGroupCount()  쓰레드 그룹에 포함된 활성상태에 있는 쓰레드 그룹의 수를 반환
  final void  checkAccess()  현재 실행 중인 쓰레드가 쓰레드 그룹을 변경할 권한이 있는 지 체크.
  만일 권한이 없다면 SecurityException을 발생시킨다.
  final void  destroy()  쓰레드 그룹과 하위 쓰레드 그룹까지 모두 삭제.
  단, 쓰레드 그룹이나 하위 쓰레드 그룹이 비워있어야 한다.
  int  enumerate(ThreadGroup[] list)
  enumerate(ThreadGroup[] list, boolean recurse)
  enumerate(Thread[] list)
  enumerate(Thread[] list, boolean recurse)
  쓰레드 그룹에 속한 쓰레드 또는 하위 쓰레드 그룹의 목록을 지정된 배열에 담고 그 개수를 반환.
  두 번째 매개변수인 recurse의 값을 true로 하면 쓰레드 그룹에 속한 하위 쓰레드 그룹에 쓰레드 또는 쓰레드 그룹까지 배열에 담는다.
  final int  getMaxPriority()  쓰레드 그룹의 최대 우선순위를 반환
  final String  getName()  쓰레드 그룹의 이름을 반환
  final ThreadGroup  getParent()  쓰레드 그룹의 상위 쓰레드 그룹을 반환
  final void  interrupt()  쓰레드 그룹에 속한 모든 쓰레드를 interrupt한다.
  final boolean  isDaemon()  쓰레드 그룹이 데몬 쓰레드 그룹인지 확인
  boolean  isDestroyed()  쓰레드 그룹이 삭제되었는지 확인
  void  list()  쓰레드 그룹에 속한 쓰레드와 하위 쓰레드 그룹에 대한 정보를 출력
  final boolean  parentOf(ThreadGroup g)  지정된 쓰레드 그룹의 상위 쓰레드 그룹인지 확인
  final void  setDaemon(boolean daemon)  쓰레드 그룹을 데몬 쓰레드 그룹으로 설정/해제
  final void  setMaxPriority(int pri)  쓰레드 그룹의 최대 우선 순위를 설정
  void  uncaughtException(Thread t, Throwable e)  쓰레드 그룹의 쓰레드가, 처리되지 않은 예외에 의해 실행이 종료되었을 때, JVM에 의해 이 메서드가 자동적으로 호출된다.

포함

    쓰레드를 쓰레드 그룹에 포함시키려면 Thread의 생성자를 이용해야 한다.

    Thread(ThreadGroup group, Runnable target)
    Thread(ThreadGroup group, String name)
    Thread(ThreadGroup group, Runnable target, String name)
    Thread(ThreadGroup group, Runnable target, String name, long stackSize)

     

    • Thread의 쓰레드 그룹과 관련된 메서드
    final ThreadGroup getThreadGroup()

          쓰레드 자신이 속한 쓰레드 그룹을 반환한다.

    Example

      쓰레드 그룹과 쓰레드를 생성한 후 main 쓰레드 그룹의 정보를 출력

      public class Test {
          public static final Logger logger = Logger.getLogger(Test.class.getName());
      
          public static void main(String[] args) {
      
              ThreadGroup main = Thread.currentThread().getThreadGroup();
              ThreadGroup group1 = new ThreadGroup("Group1");
              ThreadGroup group2 = new ThreadGroup("Group2");
      
              ThreadGroup subGroup = new ThreadGroup(group1, "SubGroup");
      
              group1.setMaxPriority(3);
      
              Runnable r = new Runnable() {
                  public void run() {
                      // 쓰레드 그룹에 대한 정보를 출력하기도 전에 쓰레드가 종료될 수 있으므로 1초간 멈추게 한다.
                      try {
                          Thread.sleep(1000);
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                  }
              };
      
              // 참조변수 없이 생성한 쓰레드는 참조가 ThreadGroup에 저장돼있기 때문에 가비지 컬렉터의 제거 대상이 되지 않는다.
              new Thread(group1, r, "thread1").start();
              new Thread(subGroup, r, "thread2").start();
              new Thread(group2, r, "thread3").start();
      
              logger.info("List of ThreadGroup : " + main.getName() 
                      + ", Active ThreadGroup : " + main.activeGroupCount()
                      + ", Active Thread : " + main.activeCount());
      
              main.list();
          }
      }
      정보: List of ThreadGroup : main, Active ThreadGroup : 3, Active Thread : 4
      java.lang.ThreadGroup[name=main,maxpri=10]
          Thread[main,5,main]
          java.lang.ThreadGroup[name=Group1,maxpri=3]
              Thread[thread1,3,Group1]
              java.lang.ThreadGroup[name=SubGroup,maxpri=3]
                  Thread[thread2,3,SubGroup]
          java.lang.ThreadGroup[name=Group2,maxpri=10]
              Thread[thread3,5,Group2]
      • setMaxPriority(int pri)

          쓰레드 그룹의 최대 우선순위를 변경한다.

          쓰레드가 쓰레드 그룹에 추가되기 이전에 호출되어야 하며, 후에 여기에 속하게 된 쓰레드 그룹과 쓰레드가 영향을 받는다.

      • list()

          호출된 결과를 통해 쓰레드 그룹에 포함된 하위 쓰레드 그룹이나 쓰레드는 들여쓰기로 구별되어 있는 걸 알 수 있다.

      우선 순위 Priority

      쓰레드가 가지고 있는 속성(멤버 변수)

      범위는 1~10이며 숫자가 높을 수록 우선 순위가 높다.

      값에 따라 쓰레드가 얻는 실행시간이 달라진다.

      쓰레드를 생성한 쓰레드로부터 상속받는다.

      쓰레드를 실행하기 전에만 우선 순위를 변경할 수 있다.

      특정 OS의 스케쥴링 정책과 JVM의 구현에 따라 결과가 다를 수 있다.

      • 싱글 코어

           우선 순위가 다를 경우, 우선 순위가 높은 쓰레드에게 상대적으로 더 많은 양의 실행시간이 주어지고 작업이 더 빨리 완료될 수 있다.

      • 멀티 코어

           차이가 없다.

      ThreadGroup API

      참고 서적: 자바의 정석 3판 2