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 강제 종료
}