2013-11-15 4 views
0

각 watchservice를 구현하는 데몬 그룹을 처리해야합니다. 내가 할 수 있기를 원하는 것은 데몬을 만들고, 활성화하고, 비활성화하고 제거하는 것입니다.데몬 풀 관리

 private void activateDaemon(Daemon daemon){ 
      Thread thread = new Thread(){ 
        @Override 
        public void run(){ 
          daemon.processEvents(); 
        } 
      }; 
      thread.start(); 
    } 

지금이 작동하지만 비활성화 및 제거하려면 : 창조의 순간

나는이 활성화 않습니다. 비활성화하면 processevents가 중지되고 (http://docs.oracle.com/javase/tutorial/essential/io/notification.html과 같은 방법) 스레드를 해지해야합니다. 제거는 데몬을 파괴해야합니다.

스레드 풀을 사용하려고 생각하고 있지만 구현 및 유형을 잘 모르겠습니다. 나는 원하는 데몬의 양을 모르기 때문에 고정 된 쓰레드 풀을 원하지 않는다. 캐쉬 된 쓰레드 풀은 충분하지만, 문서는 "짧은 수명의 많은 작업을 시작하는 응용 프로그램"에만 적합하며 데몬은 오랫동안 실행될 수 있다고합니다.

데몬 그룹 (watchservices)을 안전하게 관리, 활성화 및 비활성화하는 것이 가장 좋은 방법은 무엇입니까?

+0

데몬이 정말로 필요합니까, 아니면 전통적인 Executor에서 실행되는 독립적 인 작업 (처리 된 이벤트에서 생성)을 사용하여 문제를 다시 표현할 수 있습니까? –

+0

데몬은 명명 규칙입니다. 데몬은 감시 서비스가있는 클래스입니다. 혼란을 드려 죄송합니다. – Sven

답변

1

Executor가 작업에 적합하다면 "Short-Lived"는 단지 힌트 일 뿐이지 만 필수는 아닙니다. 10 개의 스레드가 모두 사용 중이므로 10 개의 스레드를 말하고 특정 이벤트를 대기하여 10 개의 스레드를 모두 대기 상태로두면 다른 작업을 처리 할 수 ​​없다는 것이 문제입니다.

이 문제를 해결하는 방법은 두 가지가 있습니다. 먼저 풀에 고정 크기 스레드 풀을 만들어 모든 작업을 처리 할 수있는 충분한 스레드가 있는지 확인하거나 디스패처 모델을 사용하여 두 번째 작업을 수행합니다. 여기서 하나의 스케줄러 각 이벤트를 깨우지 만 그 이벤트의 처리를 해당 풀의 스레드 (유휴 상태)에 전달합니다.

반면에 ThreadGroup/ThreadFactory를 사용하여 기본적으로 고정 된 ThreadPoolExecutor이지만 직접 제어 할 수 있고 더 많은 작업을 할 수 있습니다.