[JAVA] Thread 생성과 핵심 메서드

nick·2024년 3월 8일
0

JAVA

목록 보기
2/13

Thread란?

정의

  • Thread는 실행 단위로 볼 수 있다
    • ‘경량 프로세스’라고도 함
  • 1개의 process 안에 여러 개의 thread가 있다
    • 즉, 하나의 프로세스 안에서 여러 개의 실행 가닥이 있다
  • 단일 thread보다 다중 thread가 빠름
  • 생성될 때마다 별도의 stack이 할당된다

예시

  1. java XXX.java → 클래스 실행시키는 순간 자바 프로세스가 시작
  2. main() 메서드 수행되면서 하나의 thread가 시작된다
  3. 여러 thread 필요하면 main() 메서드에서 쓰레드 생성하면 된다
  • Tomcat과 같은 WASmain()메서드에서 생성한 thread들이 수행되는 것

Java에서 Thread를 어떻게 만들까?

생성하는 방법 2가지

  1. Runnable 인터페이스를 implements
  2. Thread 클래스를 extends

생성하는 방법

  1. Runnable 인터페이스를 구현한 경우
    • new Thread(Runnable runnable).start()
  2. Thread 클래스를 상속한 경우
    1. thread.start()

왜 2가지 방법으로 생성하는 걸 지원할까?

  • Java는 다중 상속이 불가능하다
  • B 클래스를 상속받아야 되는데 thread로 구현해야 된다면 만약 상속만 지원하면 이런 경우에는 불가능하다
  • 하지만 인터페이스는 여러 개 구현할 수 있기에 문제 없다

Thread의 핵심 메서드

run()

  • Runnable인터페이스를 구현하거나 Thread클래스를 확장할 때에는 **run()메서드가 진입점**
  • 즉, 내가 해당 thread 시작 시 실행하고 싶은 내용은 run() 메서드에 구현
  • 메서드 이름이 run()이라고 thread를 실행시키는 메서드 아님
  • thread 실행은 start() 메서드로
  • **run()메서드 종료되면 해당 thread도 끝남**
    • **run()메서드가 끝나지 않으면 자바 애플리케이션도 끝나지 않음**
    • = 모든 thread가 끝나야 해당 자바 프로세스도 끝남
    • 데몬 thread 제외 → 얘는 애플리케이션 끝나면 걍 같이 끝남

start()

  • thread를 시작할 때 쓰는 메서드
  • start() 메서드를 통해 시작했다는 것 = 해당 thread를 JVM에 추가해 실행한다는 것
  • start() 메서드 실행하면 알아서 run() 메서드 실행
  • 이 메서드가 끝날 때까지 기다리지 않고 thread 실행시키고 다음 명령어로 넘어감
  • 즉, start()메서드 호출하면 **run() 메서드 내용이 끝나던 말던 그 다음 줄의 코드 실행**

sleep()

  • Thread 클래스의 static 메서드
  • 반드시 이 메서드는 try-catch로 묶어줘야함
    • sleep() 메서드는 InterruptedException을 던질 수 있다고 선언되어 있음

getPriority(), setPriority()

  • 더 먼저 수행할 수 있는 순위
  • default = 5 (일반적인 thread의 우선순위)
  • 1(우선순위 최하) → 10(우선순위 최상)

⚠️ 우선 순위 지정은 하지마라 ⚠️

setDaemon()

  • thread가 수행되던 말던, JVM이 끝날 수 있음
  • 원래는 thread가 모두 실행 종료되어야(run()메서드가 전부 종료되어야) JVM이 종료될 수 있음
  • Daemon thread는 JVM 죽을 때, 걍 같이 죽음
    • Daemon thread가 종료되지 않아도, 실행중인 다른 thread 없으면 멈춘다

⚠️ 해당 thread 시작(start()메서드 호출)하기 전에 Daemon thread로 지정해야 된다 ⚠️

시작하고 setDaemon(true) 해봤자나 소용 없음

왜 써???

  • 모니터링 thread로 Daemon thread 쓴다
  • 주요 thread 종료되면 모니터링 하던 thread도 종료되어야 프로세스가 종료된다
  • 만약 모니터링 thread가 Daemon thread가 아니면 다른 주요 thread들이 종료되도 프로세스가 종료되지 않음
profile
티스토리로 이전 : https://andantej99.tistory.com/

0개의 댓글