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);
}
이
나는 scheduledExecutor.shutdownNow()를 추가하려고 시도했다. 내 ServletContextListener에 있지만 Tomcat 로그에 "웹 응용 프로그램 [/ servlet]이 [Timer-0]이라는 스레드를 시작한 것으로 보이지만 중지하지 못했습니다.이 오류로 인해 메모리 누수가 발생할 가능성이 큽니다. ". 이 오류를 피하려면 어떻게해야합니까? 도와 주셔서 감사합니다 – lili
shutdownNow()는 즉시 되돌아 오는 nonblocking call입니다. 스레드 풀이 실제로 다운 될 때까지 블록하는 awaitTermination()을 호출해야합니다. – maximdim
시도했지만 작동하지 않았습니다. 30 초 이상 기다려야합니까? http://stackoverflow.com/questions/9930624/tomcat7-and-scheduledexecutorservice-shutdownnow에서 자세한 내용을 작성했습니다. 감사합니다. – lili