JAVA

태태코딩 - 김영한 자바 고급[스레드]

태태코 2025. 2. 8. 16:28
반응형

Thread 메서드

Thread.threadId();  => 각 스레드에 대해 유일한 id
Thread.getName(); => 디버깅이나 로깅 목적으로 유용하다.
Thread.getPriority();  => 스레드 우선순위 1이 가장낮음 10이 가장높음 기본값: 5 set 메서드를 가지고 우선순위를 변경할 수 있다.
스케줄러가 따져보고 결정한다. *실제 실행 순서는 JVM 구현과 운영체제에 따라 달라질 수 있다.
Thread.getThreadGroup(); =>   스레드 그룹은 하나의 그룹으로 묶어서 일괄종료, 우선순위 설정을한다.
*부모 스레드* : 새로운 스레드를 생성하는 스레드를 의미한다.
Thread.getState(); => 스레드 상태
new , runnable, bolcked, waiting, time_watiting, terminated

 

 

 

 

  • new :  스레드가 생성되었거나 아직 시작되지 않은 상태
  • Runnable: 스레드가 실행 중이거나 실행될 준비가 된 상태 => CPU 실행 스케줄러에 들어간 상태
  • Blocked: 스레드가 동기화 락을 기다리는 상태
  • Waiting: 스레드가 무기한으로 다른 스레드의 작업을 기다리는 상태
  • Timed Waiting: 스레드가 일정 시간동안 다른 스레드의 작업을 기다리는 상태,
  • Terminated: 스레드의 실행이 완료된 상태.

Timed Waiting 상태를 찍으려면 본인이 본인 상태를 못찍기때문에 Main Thread를 1초 sleep()한 후 찍으면 된다.

 

 

run() 메서드를 구현할 때 exption을 밖으로 던질 수 없는 이유

 

상속하는 부모가 throws 가 없다면 자식도 throws 할 수 없음.
and 부모 메소드가 던질 수 있는 체크 예외의 하위타입만 던질 수 있다.

 

 

이유:

Parent p = new Child();

이상태일때 Parent가 가진 예외와 child 가 가진 예외가 다를 경우 자바의 exception 정책을 위반하기 때문이다.

 

 

왜 그럼 run() 메서드에서 예외처리를 못던지게 해놨는가.

 

1. 스레드가 예외를 던지면 강제 종료되게 되어있다. 즉 그런 부분을 try catch로 명시함으로써 비정상 종료를 막기 위함이다?

 

하지만 최근에는 어체크 예외를 선호하지만 과거에는 체크 예외를 선호했기 때문일 가능성 도 있다.

 

예외처리에 대한 편의성은

util을 하나 만들어서 처리하는 것이 좋다.

 

public abstract class ThreadUtils{
	public static void sleep(long millis){
    	try{
        	Thread.sleep(millis);
        }catch(InterruptedException e){
        	log("인터럽트 발생,"+e.getMesage());
            throw new RuntimeException(e);
        }
    
    }
	
}

 

 

스레드를 스택에 담을 때 this=인스턴스 를 통해서 this 값을 저장시켜놓아서 분류가 가능하다.

 

 

스레드에 기능을 요구했지만, main thread가 먼저 끝날경우 결과를 받을 수 없다.

 

  1.  sleep()을 통해 해결 가능 => 하지만 타이밍을 맞추기 어려움
  2. while문으로 스레드가 해결되었는지 계속확인 => 번거럽고 cpu를 계속 사용해야한다.

Join

 

Thread.join()을 사용하면 스레드가 종료될때까지 기다려진다. => Waiting

하지만 그렇게되면 다른 스레드가 끝날때까지 계속 기다려야한다. => 무한정 대기

 

Thread.join(1000); => timedWaiting이된다.

1초를 대기하고 빠져나간다.

 

반응형