2010-11-24 6 views
18

java에서 슬리핑 스레드를 중지 또는 중단하는 방법? 스레드를 잠글 때 스레드를 중지하여 동기화를 중지하려면 run() 메서드에서 10 분 동안 데이터를 동기화하는 스레드가 있습니다. 어떻게이 일을 성취 할 수 있습니까?슬리핑 스레드 인터럽트 또는 중지

+2

정확한 복제물이 더 이상 없습니다 :-( –

+1

작성자가 중복을 제거했기 때문에이 질문을 다시 열어야합니까? – Craigy

답변

19

스레드에서 interrupt() 메소드를 호출하십시오. 이것에 의해 sleep가 취소되어 InterruptedException가 Throw됩니다.

+2

스레드가 잠자기 상태가 아니며 Thread.sleep과 같은 작업을 수행하려고합니다. – Jaydev

11

Thread.interrupt()을 사용하여 휴면 스레드를 중단 할 수 있습니다. 이제는 스레드를 중지하는 것이 더 이상 사용되지 않습니다. (Thread.stop()가 있었지만 큰 도움이되지 않았습니다.)

잠자기 대신 스레드가 시간 초과로 개체를 알릴 때까지 대기하고 스레드를 깨우기 위해 개체를 간단하게 알릴 수 있습니다.

2

Frederik이 맞습니다. call Thread.interrupt(); 방금 ​​경고 했으니 stop()은 Java 1.1부터 사용되지 않으므로 사용하지 마십시오. 및 기타 경고. 나는 sleep()을 사용하고 스레드를 인터럽트하고 싶다면 wait() 및 notify()로 이동하는 것이 좋은 순간이라고 생각한다. 자바 쓰레드에 대한 많은 자습서가 있고 java.lang.Thread의 javadoc이 충분하기 때문에이 API에 익숙하지 않다면 계속 읽을 수 있습니다.

6

수레 (Suresh), 저는 한 가지 문제에 관심을 기울이고 싶습니다. interrupt() 메서드 자체는 스레드를 인터럽트하지 않습니다. 플래그를 true로 설정하여 스레드에 인터럽트 요청을 보냅니다. 일반적으로 스레드는 취소/중단 정책을 처리해야합니다. 이것은 Java Concurrecy in Practice, 섹션 7.1 작업 취소에 자세히 설명되어 있습니다.

Thread.sleep 및 Object.wait와 같은 라이브러리 메소드를 차단하면 스레드가 인터럽트 된 시점을 감지하여 일찍 복귀합니다. 그들은 인터럽트 상태를 지우고 InterruptedException을 던져 인터럽트에 응답합니다.

1

내가 말할 수 없기 때문에 다른 답변을 올리겠습니다. 나는 단지 Alexandr이 말한 것을 강화하고 명확하게하고 싶다. interrupt()Thread에만 플래그를 설정하고 확장 된 Thread 또는 Runnable 오브젝트는 인터럽트되었을 때 수행 할 작업을 수행하기 위해 Thread.interrupted()으로 인터럽트되었는지 확인해야합니다.

interrupt()wait() 또는 sleep()을 중지하지만 이러한 방법은 인터럽트 플래그를 설정 해제합니다. 따라서 잠자는/대기중인 스레드에서 interrupt()을 호출하면 잠자기/대기는 중지되지만 예외가 발생하는 경우를 제외하고는 중단되었음을 알 수 없으며 중단되지 않습니다.

sleep()wait() 메서드로 재정의 할 수없는 자체의 인터럽트 플래그를 구현하여 프로그램을 수정할 수있었습니다. 또한 Thread.currentThread().interrupt()으로부터 스레드를 인터럽트 할 수 있음을 알고 있습니다.

관련 문제