본문 바로가기
프로그래밍 놀이터/디자인 패턴, 리펙토링

[Effective Java] 스레드 그룹을 사용하지 말자.

by 돼지왕 왕돼지 2017. 3. 20.
반응형

 [Effective Java] 스레드 그룹을 사용하지 말자.


activecount, API, Count, Effective JAVA, enumerate, LOCK, monitor, setuncaughtexceptionhandler, thread, thread group, thread pool executor, threadgroup, threadgroup.uncaughtexception, [Effective Java] 스레드 그룹을 사용하지 말자., 구상, 기능, 기대, 기본 추상체, 락, 매커니즘, 메소드, 모니터, 무시, 보안 목적, 사ㅛㅇ금지, 쇠약, 스레드, 스레드 그룹, 스레드 안전, 스레드 풀 관리자, 쓸모 없다, 애플릿 격리, 일괄 적용, 자바 보안 모델, 충족, 큰 배열


-
스레드, 락, 모니터에 더하여 스레드 시스템에서 제공하는 기본 추상체가 스레드 그룹(thread group) 이다.
스레드 그룹은 원래 보안을 목적으로 애플릿을 격리시키는 메커니즘으로 구상되었다.
그러나 실제로는 그런 기대를 충족시키지 못해 자바 보안 모델의 표준에서 언급되지 않을 정도로 쇠약하다.


-
스레드 그룹은 기능이 별로 없다.
단지 Thread 클래스의 기본 메소드들을 여러 스레드가 포함된 그룹에 일괄로 한번에 적용할 수 있게 해준다.
그런 기본 메소드들 중 상당 수는 이미 사용금지 되었으며 남은 메소드들은 사용되는 경우가 드물다.


-
ThreadGroup 클래스의 API 메소드는 스레드 안전 관점에서도 빈약하다.
하나의 스레드 그룹에 속한 활동중인 스레드 목록을 얻으려면,
enumerate 메소드를 호출해야 하는데, 이 메소드는 모든 활동 중인 스레드를 충분히 담을 만큼 큰 배열을 매개 변수로 받는다.
이 때 activeCount 메소드를 통해 현재 활동 중인 스레드의 수를 측정하여 던지게 되는데,
전달하는 사이에 이 숫자가 바뀔 수 있고, 혹시나 활동 중인 스레드가 증가하여 배열 count가 activeCount 보다 작으면 enumerate 메소드에서는 배열 크기만큼만 스레드를 채우고 나머지는 무시한다.


-
한마디로, 스레드 그룹은 쓸모 없다.


-
자바 1.5 버전 이하에서는 ThreadGroup.uncaughtException 메소드만이 유용했는데,
1.5 배포판 기준으로 Thread 의 setUncaughtExceptionHandler 메소드로 동일한 기능을 사용할 수 있어
결국 무용지물이다.



Summary


스레드 그룹은 유용한 기능을 그리 많이 제공하지 않으며, 제공하는 기능의 대부분에 결함이 있다.
만일 스레드를 논리적인 그룹으로 묶어서 처리하는 클래스를 설계한다면, 스레드 풀 실행자(thread pool executor) 를 사용하도록 하자.





반응형

댓글