다음 코드는이 문제를 해결하려고합니다.스레드와 executor의 정상적인 종료
코드가 영원히 반복되고 처리 할 보류중인 요청이 있는지 확인합니다. 있는 경우, 새 스레드를 작성하여 요청을 처리하고이를 실행 프로그램에 제출합니다. 모든 스레드가 완료되면 60 초 동안 대기하고 보류중인 요청을 다시 확인합니다.
public static void main(String a[]){
//variables init code omitted
ExecutorService service = Executors.newFixedThreadPool(15);
ExecutorCompletionService<Long> comp = new ExecutorCompletionService<Long>(service);
while(true){
List<AppRequest> pending = service.findPendingRequests();
int noPending = pending.size();
if (noPending > 0) {
for (AppRequest req : pending) {
Callable<Long> worker = new RequestThread(something, req);
comp.submit(worker);
}
}
for (int i = 0; i < noPending; i++) {
try {
Future<Long> f = comp.take();
long name;
try {
name = f.get();
LOGGER.debug(name + " got completed");
} catch (ExecutionException e) {
LOGGER.error(e.toString());
}
} catch (InterruptedException e) {
LOGGER.error(e.toString());
}
}
TimeUnit.SECONDS.sleep(60);
}
}
내 질문에 대한 대부분의 처리는 데이터베이스와 관련이 있습니다. 그리고이 프로그램은 Windows 컴퓨터에서 실행됩니다. 누군가가 시스템을 종료하거나 로그 오프하려고 할 때 이러한 스레드는 어떻게됩니까? 실행중인 스레드와 실행 프로그램을 정상적으로 종료하는 방법.
이것은 거꾸로입니다. 'ExecutorService'가'Executors' 팩토리 메소드에 의해 리턴 된 전형적인 값 중 하나라고 가정하면, 백킹 쓰레드는 비 데몬 쓰레드입니다. 종료 훅은 그 쓰레드가 종료 될 때까지 호출되지 않으며'ExecutorService'가 종료 될 때까지 종료되지 않습니다. 실행 프로그램의 스레드가 비 데몬이거나 프로그램이 사용자 인터럽트를 수신하는 경우에만 솔루션이 사용됩니다. –
OP는 JVM이 정상적으로 종료하도록 요청 받았는지 여부를 묻습니다. 그럼에도 불구하고 대답의 내용은 정확합니다. 실행 프로그램 서비스를 더 일찍 종료하기 위해 시스템 종료 훅에서이를 수행하지 않아도됩니다. –
너무 빨리 답변 해 주셔서 감사합니다.나는 그들의 질문에 그 부분을 놓친 것 같다. 그 비트를 명확히하기 위해 세 번째''*** '를 추가 할 수 있습니까? –