자바 스레드를 만들기 위해서 개발자가 해야 하는 작업은 아래와 같다.
- 스레드 코드 작성
- JVM에세 스레드를 생성하고 스레드 코드를 실행할 것을 요청
스레드 코드를 작성하기 위해서 Thread 클래스를 이용하거나 Runnable 인터페이스를 사용할 수 있다.
Thread 클래스를 상속받아 스레드 만들기
※ Thread 생성자
※ Thread 주요 메소드
void run() | 스레드 코드, 반드시 Overriding하여 스레드 코드 작성 |
void start() | JVM에게 스레드 실행 시작 요청 |
void interrupt() | 스레드 강제 종료 |
static void yield() | 다른 스레드에게 실행을 양보, 이때 JVM은 다른 스레드를 선택하여 스케줄링 |
void join() | 스레드 종료까지 대기 |
long getId() | 스레드의 ID 값 리턴 |
String getName() | 스레드의 이름 리턴 |
int getPriority() | 1에서 10 사이의 스레드 우선순위 값 리턴 |
void setPriority(int n) | 스레드의 우선순위 값을 n으로 변경 |
Thread.State getState() | 스레드의 상태 리턴 |
static void sleep(long mills) | 스레드가 (mills) 동안 정지, mills의 단위는 밀리초 |
static Thread currentThread() | 현재 실행 중인 스레드 객체의 레퍼런스 리턴 |
1. 스레드 클래스 작성: Thread 클래스 상속
class TimerThread extends Thread{
...
}
2. 스레드 코드 작성: run() 메소드 오버라이딩
class TimerThread extends Thread{
...
@Override
public void run(){
..0
}
}
- run() 메소드 내에 작성된 코드를 스레드 코드라 함
- 스레드는 run()에서부터 실행을 시작, run()이 종료되면 스레드도 종료
- run()을 오버라이딩하지 않으면 Thread 클래스에 작성된 run()이 실행되고, 이 run()은 아무 작업도 하지 않으므로 스레드가 바로 종료
3. 스레드 객체 생성
TimerThread th = new TimerThread();
- 스래드 객체를 생성했지만 아직 스레드가 작동하는 것은 아님
4. 스레드 시작: start() 메소드 호출
th.start();
- start() 메소드는 (3)에서 생성된 스레드 객체를 스케줄링이 가능한 상태로 전환하도록 JVM에 지시
- 이후 스케줄링에 의해 이 스레드가 선택되면 JVM에 의해 run() 메소드가 호출되어 실행 시작
※ sleep() 메소드 사용
- 스레드가 sleep하는 동안 처리하는 InterruptException 예외를 처리하기 위해 반드시 try-catch 문을 사용
Runnable 인터페이스로 스레드 만들기
- Runnable은 java.lang.Runnable의 경로명을 가지는 인터페이스이며, 추상 메소드 run() 하나만을 가짐
interfact Runnable{
public void run();
}
1. 스레드 클래스 선언: Runnable 인터페이스 구현
class TimeRunnable implements Runnable{
...
}
2. 스레드 코드 작성: run() 메소드 오버라이딩
class TimerRunnable implements Runnable{
...
@Override
public void run(){
...
}
}
- run() 메소드는 스레드 코드이며 run()이 종료되면 스레드 또한 종료
3. 스레드 객체 생성
Thread th = new Thread(new TimerRunnable());
- 위 코드는 Thread 객체 th의 스레드 코드로, TimerRunnable의 run()을 사용할 것을 알려줌
4. 스레드 시작: start() 메소드 호출
th.start();
- th.start()는 Thread 객체 th를 스케줄링이 가능한 상태로 전환하도록 JVM에게 지시
- 이후 스케줄링에 의해 이 스레드가 선택되면 JVM에 의해 run() 메소드가 호출되어 실행 시작
스레드 정보
필드 | 타입 | 내용 |
스레드 이름 | String | 스레드의 이름으로서 사용자가 지정 |
스레드 ID | 정수 | 스레드의 고유 식별자 번호 |
스레드 PC(Program Count) | 정수 | 현재 실행 중인 스레드 코드의 주소 |
스레드 상태 | 정수 | NEW, RUNNABLE, WAITING, TIMED_WAITING, BLOCK, TERMINATED 중 하나 |
스레드 우선순위 | 정수 | 스레드 스케줄링 시 사용되는 우선순위 값으로서 1~10 사이의 값, 10이 최상위 우선순위 |
스레드 그룹 | 정수 | 여러 개의 자바 스레드가 하나의 그룹을 형성할 때 해당 스레드가 속한 그룹 |
스레드 레지스터 스택 | 메모리 블록 | 스레드가 실행되는 동안 레지스터들의 값 |
- 위와 같은 스레드 정보는 JVM에 의해 관리
- Thread 메소드를 사용하여 읽어낼 수 있음
데몬 스레드(daemon thread)와 사용자 스레드(user thread)
- 자바의 스레드는 데몬 스레드와 사용자 스레드로 구분
1. 데몬 스레드
- 응용프로그램이 실행되는 동안 관리를 위해 존재하는 스레드
- e.g., 가비지 컬렉션 스레드(garbage collector)
- 데몬 스레드가 살아 있더라도 사용자 스레드가 모두 종료되면 JVM과 함께 응용프로그램 종료
2. 사용자 스레드
- 응용프로그램에서 생성한 스레드
- Thread 클래스의 setDaemon(true)를 사용하여 사용자 스레드를 데몬 스레드로 변경 可