"안녕하세요, 아미고! 이미 가지고 있거나 곧 할 흥미로운 질문이 있습니다. 실행 중인 스레드를 어떻게 중지합니까? "
사용자가 프로그램에 "인터넷에서 파일을 다운로드"하라고 지시한다고 가정해 보겠습니다. 기본 스레드는 이 작업에 대해 별도의 자식 스레드를 만들고 파일을 다운로드하는 데 필요한 모든 작업이 포함된 실행 메서드의 개체를 전달합니다.
그러나 갑자기 사용자가 마음을 바꿉니다. 그는 파일을 다운로드하고 싶지 않습니다. 어떻게 작업을 취소하고 스레드를 중지합니까?
"예, 방법을 알려주세요?"
" 우리는 할 수 없습니다. 그것이 가장 일반적이고 가장 정확한 대답입니다. 당신은 스레드를 멈출 수 없습니다. 오직 스스로 멈출 수 있습니다. "
그러나 작업을 더 이상 수행할 필요가 없으며 종료해야 한다는 신호를 스레드에 보낼 수 있습니다. 메인 쓰레드가 메인 메소드에서 리턴하여 종료하듯이, 자식 쓰레드는 run 메소드에서 리턴하여 종료합니다.
"가장 좋은 방법은 무엇입니까?"
" 부울 과 같은 일부 변수를 추가할 수 있습니다 . true 이면 스레드가 실행됩니다. false 이면 스레드가 종료됩니다. 예를 들면 다음과 같습니다."
암호 | 설명 |
---|---|
|
Clock 클래스는 영원히 1초에 한 번씩 콘솔에 «Tick»을 기록합니다. ClockManager.isClockRun이 false이면 실행 메서드가 종료됩니다. |
|
메인 스레드는 영원히 실행되어야 하는 하위 스레드(시계)를 시작합니다.
10초간 기다렸다가 시계에 종료 신호를 보냅니다. 기본 스레드가 작업을 완료합니다. 클럭 스레드가 작업을 종료합니다. |
"스레드가 여러 개인 경우 어떻게 합니까?"
"스레드마다 이런 변수를 두는 것이 가장 좋습니다. 클래스에 직접 추가하는 것이 가장 편리합니다. 거기에 boolean isRun 변수를 추가할 수 있습니다 . 그러나 작업이 다음과 같은 경우 true가 되는 boolean isCancel 변수를 추가하는 것이 좋습니다. 취소 된."
암호 | 설명 |
---|---|
|
Clock 클래스는 isCancel이 false 인 한 1초에 한 번씩 «Tick»이라는 단어를 콘솔에 씁니다 .
isCancel 이 true가 되면 run 메서드가 종료됩니다. |
|
메인 스레드는 영원히 실행되어야 하는 하위 스레드(시계)를 시작합니다.
10초간 기다린 후 cancel 메서드를 호출하여 작업을 취소합니다. 기본 스레드가 작업을 완료합니다. 클럭 스레드가 작업을 종료합니다. |
"명심할게요. 고마워요, 엘리."
GO TO FULL VERSION