Java - 쓰레드 (Thread)

춤추는개발자·2022년 12월 10일
0

Java 정리

목록 보기
57/59

쓰레드의 실행 : start()

  • 쓰레드를 생성한 후에 start()를 호출해야 쓰레드가 작업을 시작한다.
Exercise1Thread t1 = new Exercise1Thread();
Exercise2Thread t2 = new Exercise1Thread();

t1.start();
t2.start();

위의 코드는 t1,t2의 쓰레드를 생성한 후 start()를 호출한 코드이다.
여기서 알아두어야 할것은 t1이 코드상 t2보다 먼저 start()를 호출했다고 해서 t1이 먼저 실행될 확률이 높지만 반드시 그런건 아니다. start()를 호출하면 쓰레드를 실행 가능한 상태가 되는거지 반드시 바로 실행되는것은 아니기 때문이다. 언제 실행될지는 OS의 스케쥴러가 결정 합니다.

run()을 호출하지 않고 왜 start()를 호출할까?

  • 처음 쓰레드를 배우는 사람은 궁금증이 있을 것이다. start()를 호출하지않고 그냥 run()을 호출하는것은 main 쓰레드에서 호출 스택에 run()을 호출해 작업을 수행하는 것이다. start()를 호출하면 새로운 쓰레드를 생성하고 그 쓰레드가 새로운 호출스택을 생성한다. 그 호출스택에 run()을 호출하여 작업을 수행하는 것이다. 즉 각각의 쓰레드가 각각의 호출스택을 생성하여 서로 독립적인 작업을 수행하는 것이다.

main 쓰레드

  • main 메서드의 코드를 수행하는 쓰레드이다.
  • 쓰레드에는 사용자 쓰레드와 데몬 쓰레드가 있는데 main 쓰레드는 사용자 쓰레드이다.

    실행 중인 사용자 쓰레드가 하나도 없을 때 프로그램은 종료 됩니다.
    만약 main 쓰레드가 종료되어도 실행중인 쓰레드가 있다면 프로그램은 종료된것이 아니다.

쓰레드의 우선순위

  • 작업의 중요도에 따라서 쓰레드의 우선순위를 다르게 하여 특정 쓰레드가 더 많은 작업시간을 갖게 할 수 있습니다.
  • 자바에서는 우선순위를 1~10위까지 존재한다. 순위가 클수록 우선순위가 앞선다.
  • 우선순위와 관련된 메서드와 상수는
메서드
void setPriority(int newPriority) : 쓰레드의 우선순위를 입력되는 newPriority 값으로 변경
int getPriority() : 현재 쓰레드의 우선순위를 반환
상수
public static final int MAX_PRIORITY = 10 // 최대 우선순위 
public static final int MIN_PRIORITY = 1 // 최소 우선순위
public static final int NORT_PRIORITY = 5 // 보통 우선순위
  • 쓰레드를 만들고 우선순위를 지정해주지 않으면 기본적으로 5로 지정 됩니다.
  • 하지만 우선순위 선정은 개발자의 희망사항일 뿐이다. 실제로는 우선순위 순서대로 프로그램이 돌아가지 않는다. 그 이유는 OS에서 돌아가는 수 많은 프로세스와 쓰레드가 있는데 OS가 그것들을 모두 무시하고 우리가 실행하고 있는 프로그램에만 특혜를 줄 수는 없기 때문이다. 우선순위는 OS가 참고만 할 뿐이다.
    우선 순위가 높은 쓰레드의 작업을 먼저 끝낼 확률이 높아지는 것이다.

쓰레드 그룹

  • 서로 관련된 쓰레드를 그룹으로 묶어서 다루기 위한 것이다.
  • 모든 쓰레드는 반드시 하나의 쓰레드 그룹에 포함되어 있어야 한다.
  • 쓰레드 그룹을 지정하지 않으면 자동적으로 생성한 쓰레드는 main 쓰레드 그룹에 속하게 된다.
  • 자신을 생성한 부모 쓰레드의 그룹과 우선순위를 상속 받습니다.

0개의 댓글