본문 바로가기

자바공부

자바 스레드 종료, 명품자바프로그래밍13장

728x90
반응형

* 스레드가 종료되는 경우는 스레드 스스로 종료하는 것과 다른 스레드에 의해 강제 종료되는 두 가지가 있다.

 

* 스레드 스스로 종료하는 경우에는 run() 메소드에서 실행 중에 리턴하거나 run()를 완전히 실행하고 리턴하는 경우이다.

public void run(){
	...
    return; // 스레드는 스스로 종료한다.
    ...
}

 

* 한 스레드가 다른 스레드를 강제로 종료할때는 종료시키고자 하는 스레드 객체의 interrupt() 메소드를 호출하면 된다.

// Example
public statc void main(String[] args){
	TimerThread th = new TimerThread();
    th.start();
    
    th.interrupt(); // TimerThread 강제 종료

}

main() 스레드에서 TimerThread의 강제 종료

main() 스레드는 TimerThread 스레드를 생성하고 th 레퍼런스를 통해 만들어진 스레드 객체를 가리킨다.

main() 스레드는 TimerThread를 강제 종료시키기 위해 th.interrupt()를 호출한다.

이때 TimerThread는 InterruptedException 예외를 받게 되며 catch 루틴이 실행되어 return하게 되면 run() 메소드가 종료된다.

sleep()의 경우 반드시 try-catch 블록으로 묶어야 하지만, 다른 경우 run() 메소드가 InterruptedException 예외를 처리하는 try-catch 블록을 가지고 있지 않다면 main() 스레드가 interrupt()를 호출하여도 TimerThread는 종료되지 않을 것이다.

정리하면, 스레드 A가 스레드 B를 강제 종료하고자 하는 경우 스레드 B의 멤버 interrupt()를 호출하여야 한다.

B.interrupt(); // 스레드 B가 종료한다.

 

* flag를 이용한 종료

한 스레드가 다른 스레드를 강제로 종료시키는 다른 방법

class TimerThread extends Thread{
	int n = 0;
    boolean flag = false; // false로 초기화
    public void finish() { flag = true; }
    public void run(){
    	while(true){
        	System.out.println(n); // 화면에 카운트 값 출력
            n++;
            try{
            	sleep(1000);
                if(flag == true)
                	return; // 스레드 종료
            }
            catch(InterruptedException e){
            	return;
            }
        }
    }
}

public statc void main(String[] args){
	TimerThread th = new TimerThread();
    th.start();
    .....
    th.finish(); // TimerThread 강제 종료
}

flag를 이용한 스레드의 강제 종료

TimerThread 클래스는 boolean 타입의 flag 멤버 변수와 finish() 메소드를 추가한다.

finish() 메소드는 다른 스레드에서 호출하도록 만든 것으로, flag값을 true로 설정하여 스레드가 종료해야 함을 표시한다.

main() 스레드가 TimerThread 스레드를 종료시키고자 하는 경우, TimerThread 클래스의 finish() 메소드를 호출한다.

한편, TimerThread 스레드는 작업도중 주기적으로 flag 멤버가 true인지 검사하고, true이면 return을 실행하여 스스로 종료한다.

 

반응형