- Thread는 실행 단위
- JVM에 의해 스케줄되는 실행 단위 코드 블록
프로세스: 같은 응용프로그램이어도 프로세스별로 고유한 메모리 영역을 보유, context switch에 비용 큼스레드: 같은 응용프로그램이면 자원과 메모리 공유, context switch에 따른 비용 적음
- 하나의 JVM은 한 번에 하나의 응용프로그램만 실행 가능
- 단, 하나의 응용프로그램에서 여러개의 스레드 생성 가능
- 스레드 생성 -> TCB(Thread Control Block : 스레드 코드 시작 주소, 스레드 상태, 우선순위 등 스레드에 대한 정보를 담음) 생성 -> JVM이 TCB 관리, JVM이 스레드 스케줄링 담당
| field | type | value |
|---|---|---|
| 이름 | String | 스레드의 이름, 사용자가 지정 |
| ID | 정수 | 스레드 고유 ID |
| Program Counter | 정수 | 현재 실행 중인 스레드 코드 주소 |
| 상태 | 정수 | NEW,RUNNABLE,WAITING,TIMED_WAITING,BLOCK,TERMINATED |
| 우선순위 | 정수 | 우선순위 값(1~10), 10이 젤 높음 |
| 그룹 | 정수 | 여러개의 스레드가 하나의 그룹을 형성할 수 있음, 속한 그룹의 정보 |
| 레지스터 스택 | 메모리 블록 | 스레드가 실행되는 도안 레지스터 값 |
- daemon thread : JVM이 사용하느 스레드, ex) garbage collection thread
- non-daemon thread : 응용프로그램에서 생성한 스레드
- JVM은 non-daemon thread가 하나 이상 살아있으면 실행을 계속 함
NEW : 생성, 실행할 준비 X
RUNNABLE : 현재 실행되고 있거나 스케줄링 기다리는 중
WAITING : notify() 혹은 notifyAll()을 불러주기 기다리고 있는 상태, 스레드 동기화를 위해 사용됨
TIMED_WAITING : 잠 자고 있는 상태
BLOCK : IO 작업을 요청해 IO 작업이 완료되기를 기다리는 상태
TERMINATED : 스레드가 종료한 상태
synchronized: 진입 시 lock을 걸고 빠져나올 때 unlock하여 스레드 동기화 진행하는 키워드
java.lang.Object의 스레드를 동기화하는 방법wait(): 다른 스레드가 notify() 해줄 때 까지 대기notify(): 대기중인 한 개의 스레드를 RUNNABLE로 만듦notifyAll(): 대기중인 모든 스레드를 RUNNABLE로 만듦
- Thread 클래스 이용
java.lang.Thread이용
(1) Thread 클래스 상속 및 run() 메소드 오버라이딩
class MyThread extends Thread{
public void run() {
//do something
}
}
(2) Thread 객체 생성 및 start()
MyThread th = new MyThread();
th.start();- Runnable 인터페이스 이용
interface Runnable() {
public void run();
}
(1) Runnable 인터페이스 구현
class MyRunnable implements Runnable{
public void run() {
// do something
}
}
(2) 스레드 객체 생성 및 start()
Thread th = new Thread(new MyRunnable());
th.start();