2009-12-07 4 views
2

현재 많은 다른 작업을 수행하는 데몬에서 작업 중입니다. 멀티 스레드이며 충돌없이 거의 모든 종류의 내부 오류를 처리 할 수 ​​있습니다. 그럼 종료 요청을 처리 할 시점에 이르렀고 어떻게해야하는지 잘 모르겠습니다.Java 데몬 - 종료 요청 처리

나는 셧다운 훅 (shutdown hook) 셋업을 가지고 있는데, 이것이 불리면 메인 데몬 루프가 실행을 멈추도록 알려주는 변수를 설정한다. 문제는이 데몬이 여러 스레드를 생성하고 오랜 시간이 걸릴 수 있다는 것입니다. 예를 들어,이 스레드 중 하나가 문서를 변환 할 수 있습니다. 대부분은 (나는 10 초 미만으로 추측하고있다) 빠를 것이지만, 10 분 이상 지속될 수있는 스레드가있을 것이다.

내가 지금하고있는 것은 shutdown hook이 보내 졌을 때, ThreadGroup.activeCount()에서 500ms (또는 그렇게) Sleep (5 초 동안)과 같은 루프를 실행하는 것입니다. ThreadGroup)이 루프가 끝나기 전에 모든 스레드에게 종료 요청이 호출되었음을 알리는 알림을 보냅니다. 그렇다면 그들이 닦고 셧다운하고있는 것과 상관없이 즉시해야 할 것입니다.

다른 사람이 제안 사항이 있으십니까? 예를 들어 MySQL과 같은 데몬이 멈추라는 말을들을 때 즉시 멈추는 것에 관심이 있습니다. 매우 느린 실행중인 10 개의 쿼리가 호출되는 경우 어떻게됩니까? 그것은 기다리는가 아니면 그냥 끝내는가? 서버가 정말 빠르다는 것을 의미합니다. 따라서 1 초 이내에 수행 할 수없는 작업이 전혀 없습니다. 당신은 지금 1000ms 안에 많은 것을 할 수 있습니다.

감사

답변

2

java.util.concurrent package 유틸리티를 제공합니다, 같은 ThreadPoolExecutor와 같이 보길 원하는 것일 수도 및 ThreadPoolExecutor.awaitTermination() (다양한 전문화 Executors 클래스에서 다른 Executor 구현의 종류와 함께) - 그들이 제공으로 구현하고자하는 기능과 똑같은 기능. 이 방법을 사용하면 스레드 및 작업 예약과 같은 것에 대해 걱정할 필요없이 응용 프로그램/작업의 실제 기능을 구현하는 데 집중할 수 있습니다.

+0

원래 ThreadPoolExecutor를 사용하여 다른 것으로 변경되었습니다. 처리 스레드, 등 잘 작동합니다. 나는 이미 스레드를 종료하도록 설정했지만 내 문제는 종료하고 스레드를 멈추라는 말을하지 않아도된다는 것이 었습니다. 문제는 프로그램을 종료해야하는 경우 주위를 둘러 볼 방법이 없다는 것입니다. 나는 마술을 찾고 있었다고 생각한다. 내 질문에 그다지 서술 적이 지 않았기 때문에 이것을 받아 들인 것으로 설정하겠습니다. 감사! – William

+0

종료 신호를 받았을 때'awaitTermination()'을 타임 아웃하고,이 시간이 만료되면 쓰레드를 죽이면 ('shutdown()') 어떻게해야합니까? 특정 기간 내에 시스템 종료를 처리해야합니까? –

+0

아니, 서버가 꺼지거나 지연이 발생하지 않는다면 빨리 끝나기를 원할뿐입니다. 나는 모든 스레드에게 종료를 알리는 호출을 보내겠다고 생각한다. 끝내려면 3 초가 걸린다. 죽이지 않으면 종료한다. 나는 마술을 찾고 있었다고 생각한다. "시간을 멈추게하고, 실을 끝내고, 다시 현실 세계로 돌아 가게 해주십시오." :) 도와 줘서 고마워! – William

1

스레드 작업이 방해받을 수 있습니까 Thread#interrupt()? 그들은 주로 자신들이 광고하는 함수 인 InterruptedException을 요구합니까? 그렇다면 위에서 언급 한 java.util.concurrent.ExecutorService#shutdownNow()이 최선의 방법입니다. 실행중인 모든 스레드를 인터럽트하고 시작되지 않은 작업 목록을 리턴합니다. 당신이 ExecutorService#submit()에 의해 생성 된 Future들로 꽉 경우

마찬가지로, 당신은 실행중인 작업을 중단 할 것을 요청 trueFuture#cancel(boolean)를 사용하여 전달할 수 있습니다. 사용 (Thread.currentThread().interrupt()를 호출하지 않고 InterruptedException을 잡기로 말하자면) 인터럽트 신호를 삼킨 당신의 통제에서 코드를 호출하지 않는 한

내장 협력 중단 시설 무엇 대략적인 자신의 깃발을 도입보다 더 나은 선택입니다 이미 거기에.