현재 많은 다른 작업을 수행하는 데몬에서 작업 중입니다. 멀티 스레드이며 충돌없이 거의 모든 종류의 내부 오류를 처리 할 수 있습니다. 그럼 종료 요청을 처리 할 시점에 이르렀고 어떻게해야하는지 잘 모르겠습니다.Java 데몬 - 종료 요청 처리
나는 셧다운 훅 (shutdown hook) 셋업을 가지고 있는데, 이것이 불리면 메인 데몬 루프가 실행을 멈추도록 알려주는 변수를 설정한다. 문제는이 데몬이 여러 스레드를 생성하고 오랜 시간이 걸릴 수 있다는 것입니다. 예를 들어,이 스레드 중 하나가 문서를 변환 할 수 있습니다. 대부분은 (나는 10 초 미만으로 추측하고있다) 빠를 것이지만, 10 분 이상 지속될 수있는 스레드가있을 것이다.
내가 지금하고있는 것은 shutdown hook이 보내 졌을 때, ThreadGroup.activeCount()에서 500ms (또는 그렇게) Sleep (5 초 동안)과 같은 루프를 실행하는 것입니다. ThreadGroup)이 루프가 끝나기 전에 모든 스레드에게 종료 요청이 호출되었음을 알리는 알림을 보냅니다. 그렇다면 그들이 닦고 셧다운하고있는 것과 상관없이 즉시해야 할 것입니다.
다른 사람이 제안 사항이 있으십니까? 예를 들어 MySQL과 같은 데몬이 멈추라는 말을들을 때 즉시 멈추는 것에 관심이 있습니다. 매우 느린 실행중인 10 개의 쿼리가 호출되는 경우 어떻게됩니까? 그것은 기다리는가 아니면 그냥 끝내는가? 서버가 정말 빠르다는 것을 의미합니다. 따라서 1 초 이내에 수행 할 수없는 작업이 전혀 없습니다. 당신은 지금 1000ms 안에 많은 것을 할 수 있습니다.
감사
원래 ThreadPoolExecutor를 사용하여 다른 것으로 변경되었습니다. 처리 스레드, 등 잘 작동합니다. 나는 이미 스레드를 종료하도록 설정했지만 내 문제는 종료하고 스레드를 멈추라는 말을하지 않아도된다는 것이 었습니다. 문제는 프로그램을 종료해야하는 경우 주위를 둘러 볼 방법이 없다는 것입니다. 나는 마술을 찾고 있었다고 생각한다. 내 질문에 그다지 서술 적이 지 않았기 때문에 이것을 받아 들인 것으로 설정하겠습니다. 감사! – William
종료 신호를 받았을 때'awaitTermination()'을 타임 아웃하고,이 시간이 만료되면 쓰레드를 죽이면 ('shutdown()') 어떻게해야합니까? 특정 기간 내에 시스템 종료를 처리해야합니까? –
아니, 서버가 꺼지거나 지연이 발생하지 않는다면 빨리 끝나기를 원할뿐입니다. 나는 모든 스레드에게 종료를 알리는 호출을 보내겠다고 생각한다. 끝내려면 3 초가 걸린다. 죽이지 않으면 종료한다. 나는 마술을 찾고 있었다고 생각한다. "시간을 멈추게하고, 실을 끝내고, 다시 현실 세계로 돌아 가게 해주십시오." :) 도와 줘서 고마워! – William