IT박스

종료와 종료의 차이점 Now of Executor Service

itboxs 2020. 11. 24. 07:47
반응형

종료와 종료의 차이점 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 루프 중단).
  • 와 함께 shutdownNowwhile 루프 내에서 줄을 주석 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 ()를 통해 취소되므로 인터럽트에 응답하지 않는 작업은 종료되지 않을 수 있습니다.

반환 : 실행을 시작하지 않은 작업 목록

참고 URL : https://stackoverflow.com/questions/11520189/difference-between-shutdown-and-shutdownnow-of-executor-service

반응형