2012-02-14 4 views

답변

30

이렇게하려면 execute()을 호출하는 대신 submit()ExecutorService으로 작업해야합니다. 이렇게하면 예약 된 작업을 조작하는 데 사용할 수있는 Future이 반환됩니다. 특히 연결된 Futurecancel(true)을 호출하여 현재 실행중인 작업을 중단 할 수 있습니다. 또는 작업이 아직 실행되지 않은 경우 실행을 모두 건너 뛸 수 있습니다.

그런데 Executors.newSingleThreadExecutor()에 의해 반환 된 개체는 실제로 ExecutorService입니다.

+2

이렇게하려면 스레드가 인터럽트 가능함을 수동으로 확인하지 않아도됩니다. 모든 스레드가 인터럽트 될 수있는 것은 아닙니다. 어쨌든 나는 생각한다. –

+2

예, 여기서는 작업을 실행하는 스레드를 인터럽트하는 방법에 대해 설명합니다. 작업이 중단에 응답하는지 여부는 전혀 다른 질문입니다. 그것은 작업이하는 일에 달려 있습니다. – erickson

+0

@erickson 나는 비슷한 질문 [here]을 가지고있다. (http://stackoverflow.com/questions/29159184/how-can-i-interrupt-resttemplate-call-as-soon-as-my-thread-is-interrupted) 스레드 인터럽트와 관련있다. 가능하면저기서 저를 도울 수 있습니까? 아직 어떤 응답도받지 못했기 때문에 어떤 도움을 주시면 대단히 감사하겠습니다. – john

4

executor의 내부 관리 스레드를 인터럽트하는 또 다른 방법은 ExecutorService에서 shutdownNow(..) 메서드를 호출하는 것입니다. 그러나 @ erickson의 해결책과 반대되는 점은 전체 ThreadPoolExecutor이 더 이상 사용할 수 없게된다는 점입니다.

이 접근법은 ExecutorService이 더 이상 필요하지 않고 Future 인스턴스의 탭을 유지하는 것이 불필요한 경우 유용합니다 (이 예는 응용 프로그램의 exit(..) 메서드의 가장 좋은 예입니다). ExecutorService#shutdownNow(..)의 javadoc에서

관련 정보 :

시도가 실행 중의 액티브 한 태스크 모든 정지 할 수는 대기 중의 태스크의 처리를 정지하고, 실행을 대기하고 있던 태스크의리스트를 돌려줍니다.

적극적으로 작업을 처리하기 위해 최선의 노력을하지 않고서도 처리를 중지 할 수 없습니다. 예를 들어, 일반적인 구현은 Thread.interrupt를 통해 취소하므로 인터럽트에 응답하지 못한 작업은 절대로 종료되지 않을 수 있습니다.

관련 문제