java/개념

스레드 종료

unhyepnhj 2024. 11. 28. 15:02

스레드는 스스로 종료하거나 다른 스레드에 의해 강제 종료될 수 있으며, 종료된 스레드를 다시 살릴 수 없다.

 

스스로 종료

메소드가 실행 중 또는 완전히 실행한 후 return하면 스레드가 종료된다.

void run(){
	...
    return;	//스스로 종료
    ...
}

 

강제 종료 - interrupt()

종료하고자 하는 스레드의 interrupt() 메소드를 호출하면 스레드가 종료된다. 스레드 A가 스레드 B를 강제 종료시키고자 하는 경우, 스레드 A가 스레드 B의 interrupt()를 호출해야 한다.

B.interrupt();

스레드 B의 interrupt()가 호출되면 B 스레드에 InterruptedException 예외가 발생하는데, 이때 try-catch문에서 catch 루틴이 실행되어 return하게 되면 run() 메소드가 종료된다. catch 블록에서 return하지 않으면 run() 메소드가 끝나지 않기 때문에, interrupt()가 호출되었음에도 B는 종료되지 않는다.

class B extends Thread(){
	private int n=0;
    @Override
    public void run(){
    	while(true){
        	System.out.println(n);	//카운트 출력
            n++;
            try{
            	sleep(1000);
            }catch(InterruptedException e){
            	return;	//외부에서 interrupt()되었을 때 스스로 리턴하여 종료
            }
        }
    }
}

 

강제 종료 - flag

B 클래스에 boolean형 flag 필드와 finish() 메소드를 추가하고, main 스레드가 B 스레드를 종료하고자 하는 경우 B 클래스의 finish() 메소드를 호출해 종료한다. 한편, B 스레드는 주기적으로 flag가 true인지 검사하여 true이면 return하여 스스로 종료한다.

class B extends Thread(){
	private int n=0;
    public boolean flag=false;	//flag==true이면 스레드 종료
    public void finish(){ flag=true; }
    
    @Override
    public void run(){
    	while(true){
        	System.out.println(n);	//카운트 출력
            n++;
            try{
            	sleep(1000);
            }catch(InterruptedException e){
            	return;	//외부에서 interrupt()되었을 때 스스로 리턴하여 종료
            }
        }
    }
}

public static void main(String[] args){
	B b=new B();
    b.start();	//스레드 실행
    ...
    b.finish();	//B의 finish() 호출 -> flag=true가 되어 B 강제 종료
}