"안녕하세요, 아미고! 이미 가지고 있거나 곧 할 흥미로운 질문이 있습니다. 실행 중인 스레드를 어떻게 중지합니까? "

사용자가 프로그램에 "인터넷에서 파일을 다운로드"하라고 지시한다고 가정해 보겠습니다. 기본 스레드는 이 작업에 대해 별도의 자식 스레드를 만들고 파일을 다운로드하는 데 필요한 모든 작업이 포함된 실행 메서드의 개체를 전달합니다.

그러나 갑자기 사용자가 마음을 바꿉니다. 그는 파일을 다운로드하고 싶지 않습니다. 어떻게 작업을 취소하고 스레드를 중지합니까?

"예, 방법을 알려주세요?"

" 우리는 할 수 없습니다. 그것이 가장 일반적이고 가장 정확한 대답입니다. 당신은 스레드를 멈출 수 없습니다. 오직 스스로 멈출 수 있습니다. "

그러나 작업을 더 이상 수행할 필요가 없으며 종료해야 한다는 신호를 스레드에 보낼 수 있습니다. 메인 쓰레드가 메인 메소드에서 리턴하여 종료하듯이, 자식 쓰레드는 run 메소드에서 리턴하여 종료합니다.

"가장 좋은 방법은 무엇입니까?"

" 부울 과 같은 일부 변수를 추가할 수 있습니다 . true 이면 스레드가 실행됩니다. false 이면  스레드가 종료됩니다. 예를 들면 다음과 같습니다."

암호 설명
class Clock implements Runnable
{
public void run()
{
while (true)
{
Thread.sleep(1000);
System.out.println("Tick");

if (!ClockManager.isClockRun)
return;
}
}
}

Clock 클래스는 영원히 1초에 한 번씩 콘솔에 «Tick»을 기록합니다.

ClockManager.isClockRun이 false이면 실행 메서드가 종료됩니다.

class ClockManager
{
public static boolean isClockRun = true;
public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
isClockRun = false;
}

}
메인 스레드는 영원히 실행되어야 하는 하위 스레드(시계)를 시작합니다.

10초간 기다렸다가 시계에 종료 신호를 보냅니다.

기본 스레드가 작업을 완료합니다.

클럭 스레드가 작업을 종료합니다.

"스레드가 여러 개인 경우 어떻게 합니까?"

"스레드마다 이런 변수를 두는 것이 가장 좋습니다. 클래스에 직접 추가하는 것이 가장 편리합니다. 거기에 boolean isRun 변수를 추가할 수 있습니다 . 그러나 작업이 다음과 같은 경우 true가 되는 boolean isCancel 변수를 추가하는 것이 좋습니다. 취소 된."

암호 설명
class Clock implements Runnable
{
private boolean isCancel = false;

public void cancel()
{
this.isCancel = true;
}

public void run()
{
while (!isCancel)
{
Thread.sleep(1000);
System.out.println("Tick");
}
}
}
Clock 클래스는 isCancel이 false 인 한 1초에 한 번씩 «Tick»이라는 단어를 콘솔에 씁니다 .

isCancel 이 true가 되면 run 메서드가 종료됩니다.

public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
clock.cancel();
}
메인 스레드는 영원히 실행되어야 하는 하위 스레드(시계)를 시작합니다.

10초간 기다린 후  cancel 메서드를 호출하여 작업을 취소합니다.

기본 스레드가 작업을 완료합니다.

클럭 스레드가 작업을 종료합니다.

"명심할게요. 고마워요, 엘리."