본문 바로가기
java/개념

스레드 만들기

by unhyepnhj 2024. 11. 19.

자바 스레드를 만들기 위해서 개발자가 해야 하는 작업은 아래와 같다.

  1. 스레드 코드 작성
  2. 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)를 사용하여 사용자 스레드를 데몬 스레드로 변경 可

'java > 개념' 카테고리의 다른 글

스레드 종료  (0) 2024.11.28
스레드 생명 주기와 스케줄링  (0) 2024.11.28
자바의 멀티스레딩  (0) 2024.11.19
멀티태스킹  (0) 2024.11.19
배치관리자  (0) 2024.06.28