Thread란?
정의
- Thread는 실행 단위로 볼 수 있다
- 1개의 process 안에 여러 개의 thread가 있다
- 즉, 하나의 프로세스 안에서 여러 개의 실행 가닥이 있다
- 단일 thread보다 다중 thread가 빠름
- 생성될 때마다 별도의 stack이 할당된다
예시
java XXX.java
→ 클래스 실행시키는 순간 자바 프로세스가 시작
main()
메서드 수행되면서 하나의 thread가 시작된다
- 여러 thread 필요하면
main()
메서드에서 쓰레드 생성하면 된다
- Tomcat과 같은 WAS도
main()
메서드에서 생성한 thread들이 수행되는 것
Java에서 Thread를 어떻게 만들까?
생성하는 방법 2가지
Runnable
인터페이스를 implements
Thread
클래스를 extends
생성하는 방법
- Runnable 인터페이스를 구현한 경우
new Thread(Runnable runnable).start()
- Thread 클래스를 상속한 경우
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들이 종료되도 프로세스가 종료되지 않음