2012-03-29 2 views
10

ScheduledExecutorService을 내 응용 프로그램에 사용합니다. 예약 된 스레드를 실행하려면 특정 유틸리티 클래스에서 수시로 사용해야합니다.ScheduledExecutorService : 종료를 호출해야하는 경우?

고정 필드에 ScheduledExecutorService을 보관하는 것이 좋습니다. 이 경우 ScheduledExecutorService.shutdown()을 호출해야합니까? 종료를 요청하지 않으면 어떤 위험이 있습니까?

private static ScheduledExecutorService exec = Executors.newScheduledThreadPool(5); 

public void scheduleTask(String name) { 
     Future<?> future = futuresMapping.get(name); 
     if(future!=null && !future.isDone()) 
      future.cancel(true); 

     //execute once 
     Future<?> f = scheduledExecutor.schedule(new MyTask()), 1, TimeUnit.MINUTES); 
     futuresMapping.put(name, f); 
} 

답변

5

항상 shutdown() 또는 shutdownNow()를 호출해야합니다. 그렇게하지 않으면 응용 프로그램을 종료하는 방법에 따라 관리되는 환경에 있는지 여부에 따라 스레드가 활성화되어 있으므로 응용 프로그램이 절대로 종료되지 않을 수 있습니다.

일반적으로 Spring의 DisposableBean.destroy()와 같은 일종의 라이프 사이클 이벤트 메소드에서 shutdown()을 호출하거나, 프레임 워크를 사용하지 않는 경우 앱을 종료하기 전에 호출해야합니다.

+0

나는 scheduledExecutor.shutdownNow()를 추가하려고 시도했다. 내 ServletContextListener에 있지만 Tomcat 로그에 "웹 응용 프로그램 [/ servlet]이 [Timer-0]이라는 스레드를 시작한 것으로 보이지만 중지하지 못했습니다.이 오류로 인해 메모리 누수가 발생할 가능성이 큽니다. ". 이 오류를 피하려면 어떻게해야합니까? 도와 주셔서 감사합니다 – lili

+0

shutdownNow()는 즉시 되돌아 오는 nonblocking call입니다. 스레드 풀이 실제로 다운 될 때까지 블록하는 awaitTermination()을 호출해야합니다. – maximdim

+0

시도했지만 작동하지 않았습니다. 30 초 이상 기다려야합니까? http://stackoverflow.com/questions/9930624/tomcat7-and-scheduledexecutorservice-shutdownnow에서 자세한 내용을 작성했습니다. 감사합니다. – lili

3

효과적인 자바 2 에드 말한다 감사 : 내가 생각 무엇

(

그리고 여기 정상적으로 종료 할 집행자에게 어떻게하면 경우 이 작업을 수행하지 않으면 이 발생하여 VM이 종료되지 않습니다.)

executor.shutdown();