isAlive() 메서드는 자바 Thread 클래스에서 해당 스레드가 현재 '살아 있는(alive)' 상태인지 확인하는 데 사용됩니다. 여기서 '살아 있다'는 것은 스레드가 start() 메서드를 통해 시작되었지만 아직 종료되지 않은 상태를 의미합니다. run() 메서드가 호출되면 스레드는 일정 시간 동안 작업을 수행한 뒤 실행을 멈추며, 이후에는 더 이상 alive 상태가 아닙니다.
문법(Syntax)
final Boolean isAlive()
isAlive()는 호출 대상 스레드가 아직 종료되지 않고 실행 중이라면 true를 반환하고, 그렇지 않다면 false를 반환합니다. 이 메서드는 final로 선언되어 있기 때문에 하위 클래스에서 오버라이딩할 수 없습니다.
그럼 실제 예제를 통해 동작 방식을 살펴보겠습니다.
예제
public class Demo extends Thread{
public void run(){
System.out.println("sample ");
try{
Thread.sleep(25);
}
catch (InterruptedException ie){
}
System.out.println("only ");
}
public static void main(String[] args){
Demo my_obj_1 = new Demo();
Demo my_obj_2 = new Demo();
my_obj_1.start();
System.out.println("The first object has been created and started");
my_obj_2.start();
System.out.println("The first object has been created and started");
System.out.println(my_obj_1.isAlive());
System.out.println("The isAlive function on first object has been called");
System.out.println(my_obj_2.isAlive());
System.out.println("The isAlive function on second object has been called");
}
}실행 결과
The first object has been created and started sample The first object has been created and started sample true The isAlive function on first object has been called true The isAlive function on second object has been called only only
코드 분석
위 예제에서 Demo 클래스는 Thread 클래스를 상속(extends)하여 정의되었습니다. run() 메서드 내부에는 try-catch 블록이 포함되어 있으며, try 블록에서는 sleep() 함수를 호출해 25밀리초 동안 스레드를 일시 중지하고, catch 블록은 비워 두었습니다.
main() 메서드에서는 Demo 객체의 인스턴스 두 개를 생성합니다. 첫 번째 객체를 start()로 실행한 뒤, isAlive() 메서드를 호출하여 해당 스레드가 실행 중인 상태인지 확인합니다. 두 번째 객체에 대해서도 동일한 방식으로 확인을 진행합니다.
실행 결과를 보면 두 스레드 모두 start() 직후 아직 종료되지 않았기 때문에 isAlive()가 true를 반환한 것을 확인할 수 있습니다. 참고로 멀티스레드 환경에서는 스레드 스케줄링에 따라 출력 순서가 달라질 수 있습니다.
핵심 포인트 정리
- 스레드가 start() 된 후 run() 실행이 끝나기 전까지 → true 반환
- start() 호출 전 또는 run() 실행이 완료된 후 → false 반환
- final 메서드이므로 하위 클래스에서 재정의(오버라이딩) 불가능
- 스레드 생존 여부를 확인할 때 join()과 함께 유용하게 활용 가능