종료와 종료의 차이점 Now of Executor Service
나는 사이의 기본적인 차이를 알고 싶어 shutdown()
하고 shutdownNow()
아래로 종료에 대한 Executor Service
내가 이해로까지?로를 shutdown()
사용해야 우아한 들이받은 및 처리를 위해 대기중인 있지만 전체에 수 있어야 시작되지 않은 모든 작업을 의미하는 종료 shutdownNow()
않습니다 갑작스러운 종료의 다운 완료되지 않은 일부 작업이 취소되고 시작되지 않은 작업도 취소됨을 의미합니다. 내가 놓친 암시 적 / 명시 적 다른 것이 있습니까?
PS : 나는에 또 다른 질문을 발견 SO 이 관련이 있지만 내가 알고 싶은 정확히 무엇을.
요약하면 다음과 같이 생각할 수 있습니다.
shutdown()
새 작업을 수락 할 수 없다고 실행기 서비스에 알리지 만 이미 제출 된 작업은 계속 실행됩니다.shutdownNow()
동일한 작업을 수행하고 관련 스레드를 중단하여 이미 제출 된 작업 을 취소하려고 합니다. 작업이 중단을 무시shutdownNow
하면은와 정확히 동일한 방식으로 작동합니다shutdown
.
당신은 아래의 예를 시도하고 대체 할 수 shutdown
에 의해 shutdownNow
더 나은 실행의 서로 다른 경로를 이해하기 :
- 를 사용 하면 실행중인 작업이 중단 되지 않고 계속 실행되기 때문에
shutdown
출력 됩니다.Still waiting after 100ms: calling System.exit(0)...
- 를 사용
shutdownNow
하면 출력은 다음interrupted
과 같습니다Exiting normally...
. 실행중인 작업이 중단 되었기 때문에 중단을 포착 한 다음 수행중인 작업을 중지합니다 (while 루프 중단). - 와 함께
shutdownNow
while 루프 내에서 줄을 주석Still waiting after 100ms: calling System.exit(0)...
처리하면 중단이 더 이상 실행중인 작업에 의해 처리되지 않기 때문에 얻을 수 있습니다.
public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(1);
executor.submit(new Runnable() {
@Override
public void run() {
while (true) {
if (Thread.currentThread().isInterrupted()) {
System.out.println("interrupted");
break;
}
}
}
});
executor.shutdown();
if (!executor.awaitTermination(100, TimeUnit.MICROSECONDS)) {
System.out.println("Still waiting after 100ms: calling System.exit(0)...");
System.exit(0);
}
System.out.println("Exiting normally...");
}
shutdown()
:
ExecutorService 내부의 스레드를 종료하려면 해당 shutdown()
메서드 를 호출합니다 . ExecutorService는 즉시 종료되지 않지만 더 이상 새 작업을 수락하지 않으며 모든 스레드가 현재 작업을 완료하면 ExecutorService가 종료됩니다. shutdown ()이 호출되기 전에 ExecutorService에 제출 된 모든 작업이 실행됩니다.
shutdownNow()
:
ExecutorService를 즉시 종료하려면 shutdownNow()
메서드를 호출 할 수 있습니다 . 이렇게하면 실행중인 모든 작업이 즉시 중지되고 제출되었지만 처리되지 않은 모든 작업은 건너 뜁니다. 실행 작업에 대한 보장은 없습니다. 아마도 그들은 멈추고, 아마도 끝까지 실행될 것입니다. 최선의 시도입니다.
로부터 의 javadoc :
void shutdown
이전에 제출 한 작업이 실행되지만 새 작업은 수락되지 않는 순서대로 종료를 시작합니다.
List<Runnable> shutdownNow()
현재 실행중인 모든 작업을 중지하려고 시도하고 대기중인 작업의 처리를 중지하며 실행을 기다리고 있던 작업 목록을 반환합니다.
적극적으로 실행중인 작업의 처리를 중지하려는 최선의 시도 이상의 보장 은 없습니다 .
예를 들어, 일반적인 구현은 Thread.interrupt ()를 통해 취소되므로 인터럽트에 응답하지 않는 작업은 종료되지 않을 수 있습니다.
반환 : 실행을 시작하지 않은 작업 목록
'IT박스' 카테고리의 다른 글
한 줄의 텍스트를 한 줄로 유지-전체 줄을 줄 바꿈하거나 전혀 줄 바꿈 없음 (0) | 2020.11.24 |
---|---|
sed에서 큰 따옴표와 작은 따옴표를 어떻게 이스케이프합니까? (0) | 2020.11.24 |
상속이있는 @Data 주석 lombok에서 equals / hashCode 경고 (0) | 2020.11.24 |
Android Studio build.gradle 경고 메시지 (0) | 2020.11.24 |
문자열을 정수로 변환하는 데 sscanf 또는 atoi의 차이점은 무엇입니까? (0) | 2020.11.24 |