본문 바로가기

Programming/JAVA

멀티 스레드(8) - 스레드 그룹 4

 

 

 

앞선 아티클에서 우리는 스레드 그룹 생성 기능을 살펴보았습니다. 

 

 

 

멀티 스레드(8) - 스레드 그룹 3

스레드 그룹을 명시적으로 선언하는 방법도 있습니다. ThreadGroup 생성자를 이용해서 객체를 생성하는 방식입니다. 이 때 생성자에서 ThreadGroup의 이름만 파라미터로 줄 수 있고, 부모 ThreadGroup과

nozeroslope.tistory.com

 

 

당연한 의문인데, 이러한 스레드 그룹을 사용했을 때의 장점은 무엇이 있을까요? '그룹'으로 묶여있으니, 당연한 이야기지만 그룹을 일괄적으로 컨트롤이 가능하다는 장점이 있겠죠. 

 

대표적인 예시가 interrupt( )입니다. ThreadGroup에서 제공하는 interrupt( ) 메서드를 사용하면, 그룹 내에 포함된 모든 스레드들을 일괄적으로 interrupt 할 수 있습니다. 스레드 10개를 종료하기 위해서 각각의 스레드에서 interrrupt( ) 호출을 총 10회 해야 하지만, 만일 이 스레드들이 같은 스레드 그룹에 속해있다면 스레드 그룹의 interrupt( ) 1회만 호출하면 됩니다.

 

참고로 이 ThreadGroup의 interrupt( )가 작동하는 원리는, 이 ThreadGroup의 interrupt( ) 메서드는 그룹에 포함된 모든 스레드의 interrupt( ) 메서드를 내부적으로 호출하는 방식입니다. 

 

여기서 하나 파생되는 주의사항이 있습니다. ThreadGroup의 interrupt( ) 메서드는 소속 스레드 각각의 interrupt( )를 호출할 뿐, 개별 스레드에서 발생하는 InterruptedException에 대한 예외 처리를 하지 않습니다. 그래서 개별 스레드에서 예외 처리를 진행해야 합니다. 

 

ThreadGruop이 가진 메서드는 아래와 같이 다양한게 준비되어 있습니다. 다만, stop( ) 등의 메서드는 deprecated되었습니다(위험성으로 인하여). suspend( ), resume( ), stop( ) 등은 현재는 사용하지 않으므로 interrupt( ) 메서드를 이용해 스레드들을 안전하게 종료하는 것이 좋습니다. 

 

메서드 설명
int activeCount( ) 현재 그룹 및 하위 그룹에서 활동 중인 모든 스레드의 수를 리턴
int activeGroupCount( ) 현재 그룹에서 활동 중인 모든 하위 그룹의 수를 리턴
void checkAccess( ) 현재 스레드가 스레드 그룹을 변경할 권한이 있는지 체크. 없을 경우 SecurityException을 발생한다.
void destroy( ) 현재 그룹 및 하위 그룹을 모두 삭제함. 단, 그룹 내에 포함된 모든 스레드들이 종료 상태가 되어야 함
boolean isDestroyed( ) 현재 그룹이 삭제되었는지 여부를 리턴
int getMaxPriority( ) 현재 그룹에 포함된 스레드가 가질 수 있는 최대 우선순위 리턴
void setMaxPriority(int pri) 현재 그룹에 포함된 스레드가 가질 수 있는 최대 우선순위를 설정
String getName( ) 현재 그룹의 이름을 리턴
ThreadGroup getParent( ) 현재 그룹의 부모 그룹을 리턴
boolean parentOf(ThreadGroup g) 현재 그룹이 매개값으로 지정한 스레드 그룹의 부모인지 여부를 리턴
boolean isDaemon( ) 현재 그룹이 데몬 그룹인지 여부를 리턴
void setDaemon(boolean daemon) 현재 그룹을 데몬 그룹으로 설정
void list( ) 현재 그룹에 포함된 스레드와 하위 그룹에 대한 정보를 출력
void interrupt( ) 현재 그룹에 퐇마된 모든 스레드들을 interrupt