2013-02-10 5 views
2

실행하는 동안 단일 스레드를 종료하고 싶습니다 정상적으로 종료하십시오!실행중인 단일 스레드 종료

안전하지 않은 행동으로 인해 Thread.stop()이나 Thread.destroy()을 사용하고 싶지 않습니다.

참고 : ExecutorService.shutdown() 옵션을 사용하는 것에 익숙합니다. 그러나 구현할 다른 방법을 알고 싶습니다.

+1

'ExecutorService.shutdown()'은 실행중인 스레드를 종료하지 않으며, 단지 executor가 새로운 작업을 받아들이지 않는다고 말합니다. – assylias

답변

4

스레드를 중지하는 표준 방법은 thread.interrupt();를 호출하는 것입니다. 작동하려면, 당신은 당신이 예를 들어, 중지 등 응답 스레드 있는지 확인해야합니다

Thread t = new Thread(new Runnable() { public void run { 
    while(!Thread.currentThread().isInterrupted()) { 
     //your code here 
    } 
}}); 
t.start(); 
t.interrupt(); 

이 경우에만 작동 상태를 정기적으로 점검합니다. 중단 메커니즘을 인터럽트 가능한 메서드 (일반적으로 I/O, 차단 큐, 중단 될 때까지 차단할 수있는 절전/대기 제공 메서드)에 위임 할 수 있습니다.

참고 :이 예제에서는, 당신은 또한 사용할 수 있습니다

while(!interrupted()) { 
     //your code here 
    } 

interrupted()은 중단 플래그가 재설정 것을 제외하고 Thread.currentThread().isInterrupted()과 같은 일을한다. 그것은 당신의 실이므로, 중요하지 않습니다.

+0

'interrupted()'의 한 가지 장점은 정적이라는 것입니다. 따라서 while (! interrupted()) {...}'코드가 덜 복잡해 질 수 있습니다. –

+0

@MarkoTopolnik 나는이 토론을 했었다는 것을 기억한다 ;-) – assylias

+1

나는 실제로 그 토론을 언급하고있다. 나는 단지 새로운 결론을 제시합니다 :) –

0

run() 방법의 루프가 Thread 인 경우 하나의 옵션은 루프가 모든 반복에서 플래그 값을 확인하는지 여부입니다.

스레드가 다음 반복을 시작하기 전에 실행을 중지하는 등의 코드 외부에서 플래그를 설정할 수 있습니다.

+0

스레드를 중지하는 표준 방법은'thread.interrupt();'를 호출하는 것입니다. – assylias

1

어떤 이유로 든 스레드의 run() 메소드를 종료해야합니다. 이를 달성하는 방법은 에 스레드에 따라 다릅니다.

  • 스레드가 반복하는 경우 플래그를 올리면 루프의 조건에 따라 스레드를 중지 할 수 있습니다.
  • 스레드가 Socket 또는 다른 스트림을 통해 대기중인 경우 스트림을 닫기 만하면됩니다.
  • InterruptedException을 던질 수있는 호출에서 스레드가 차단 된 경우 스레드를 interrupt() 수 있으며 예외는 무시하십시오.
  • 스레드가 블로킹 큐의 요소를 소비하는 경우 포이즌 피임 메서드를 사용합니다. 즉, 큐에 "루프 반복 중지"를 의미하는 요소를 추가하는 것을 의미합니다.
+1

+1하지만 맞춤 플래그 대신 기본 제공되는 인터럽트 메커니즘을 사용하는 것이 항상 바람직하다는 점에 유의하십시오.다른 인터럽트 가능 코드로 더 잘 작성할 수있는 좋은 기회가 있습니다. –

+0

@ MarkoTopolnik 나는 여전히 그 질문에 대한 표준 응답이 항상 "부울 플래그 사용"이라는 이유를 이해하지 못한다. ... – assylias

+3

@assylias 방금 봤고 [this] (http://docs.oracle.com/cd /E19455-01/806-3461/ch2mt-57/index.html)은 부분적인 대답을 갖고있는 듯하다. 다른 모든 방해 메커니즘이 훨씬 더 나빠진다는 것을 모두가 알게 될 때까지는 낙담했다. –

1

코드에 isStopped() 플래그가있을 수 있습니다. 그리고 실행중인 스레드는이 플래그를 정기적으로 검사하여 중지해야하는지 확인해야합니다. 스레드를 정상적으로 중지 시키려면 실행중인 코드를 중지 할 수있는 방법으로 작성해야합니다.

You can take a look at this question for some more detailed answers