실행하는 동안 단일 스레드를 종료하고 싶습니다 정상적으로 종료하십시오!실행중인 단일 스레드 종료
안전하지 않은 행동으로 인해 Thread.stop()
이나 Thread.destroy()
을 사용하고 싶지 않습니다.
참고 : ExecutorService.shutdown()
옵션을 사용하는 것에 익숙합니다. 그러나 구현할 다른 방법을 알고 싶습니다.
실행하는 동안 단일 스레드를 종료하고 싶습니다 정상적으로 종료하십시오!실행중인 단일 스레드 종료
안전하지 않은 행동으로 인해 Thread.stop()
이나 Thread.destroy()
을 사용하고 싶지 않습니다.
참고 : ExecutorService.shutdown()
옵션을 사용하는 것에 익숙합니다. 그러나 구현할 다른 방법을 알고 싶습니다.
스레드를 중지하는 표준 방법은 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()
과 같은 일을한다. 그것은 당신의 실이므로, 중요하지 않습니다.
'interrupted()'의 한 가지 장점은 정적이라는 것입니다. 따라서 while (! interrupted()) {...}'코드가 덜 복잡해 질 수 있습니다. –
@MarkoTopolnik 나는이 토론을 했었다는 것을 기억한다 ;-) – assylias
나는 실제로 그 토론을 언급하고있다. 나는 단지 새로운 결론을 제시합니다 :) –
run()
방법의 루프가 Thread
인 경우 하나의 옵션은 루프가 모든 반복에서 플래그 값을 확인하는지 여부입니다.
스레드가 다음 반복을 시작하기 전에 실행을 중지하는 등의 코드 외부에서 플래그를 설정할 수 있습니다.
스레드를 중지하는 표준 방법은'thread.interrupt();'를 호출하는 것입니다. – assylias
어떤 이유로 든 스레드의 run()
메소드를 종료해야합니다. 이를 달성하는 방법은 에 스레드에 따라 다릅니다.
Socket
또는 다른 스트림을 통해 대기중인 경우 스트림을 닫기 만하면됩니다.InterruptedException
을 던질 수있는 호출에서 스레드가 차단 된 경우 스레드를 interrupt()
수 있으며 예외는 무시하십시오.+1하지만 맞춤 플래그 대신 기본 제공되는 인터럽트 메커니즘을 사용하는 것이 항상 바람직하다는 점에 유의하십시오.다른 인터럽트 가능 코드로 더 잘 작성할 수있는 좋은 기회가 있습니다. –
@ MarkoTopolnik 나는 여전히 그 질문에 대한 표준 응답이 항상 "부울 플래그 사용"이라는 이유를 이해하지 못한다. ... – assylias
@assylias 방금 봤고 [this] (http://docs.oracle.com/cd /E19455-01/806-3461/ch2mt-57/index.html)은 부분적인 대답을 갖고있는 듯하다. 다른 모든 방해 메커니즘이 훨씬 더 나빠진다는 것을 모두가 알게 될 때까지는 낙담했다. –
코드에 isStopped()
플래그가있을 수 있습니다. 그리고 실행중인 스레드는이 플래그를 정기적으로 검사하여 중지해야하는지 확인해야합니다. 스레드를 정상적으로 중지 시키려면 실행중인 코드를 중지 할 수있는 방법으로 작성해야합니다.
You can take a look at this question for some more detailed answers
'ExecutorService.shutdown()'은 실행중인 스레드를 종료하지 않으며, 단지 executor가 새로운 작업을 받아들이지 않는다고 말합니다. – assylias