개발자 끄적끄적
Properties, Thread - (1) 본문
<Thread>
- 메모리를 할당받아 실행 중인 프로그램을 프로세스라고 한다
- 프로세스 내의 명령어 블록으로 시작점과 종료점을 가진다
- 실행 중에 멈출 수 있으며 동시에 수행 가능
- 어떤 프로그램내에서 특히 프로세스 내에서 실행되는 흐름의 단위
<Thread 클래스>
- JDK에서 지원하는 java.lang.Thread제공
<Thread 생성자>
1. Thread(String s) : 스레드 이름
2. Thread(Runnable r) : 인터페이스 객체
3. Thread(Runnable r, String s) : 인터페이스 객체와 스레드 이름
<Thread 메소드>
- static void sleep(long msec) throws Interrupted Exception : mesc에 지정된 밀리초 동안 대기
- String getName() : 스레드의 이름을 s로 설정
- void setName(String s) : 스레드의 이름을 s로 설정
- void start() : 스레드를 시작 run()메소드 호출
- int getPriority() : 스레드의 우선 순위를 반환
- void setpriority(int p) : 스레드의 우선순위를 p값으로
- boolean isAlive() : 스레드가 시작되었고 아직 끝나지 않았으면 true, 끝났으면 false반환
- void join() throws InterruptedException : 스레드가 끝날 때 까지 대기
- void run() : 스레드가 실행할 부분 기술(오버라이딩 사용)
- void suspend() : 스레드가 일시정지 resume()에 의해 다시 시작할 수 있다
- void resume() : 일시 정지된 스레드를 다시 시작
- void yield() : 다른 스레드에게 실행 상태를 양보하고 자신은 준비 상태로
<Thread 생성>
1. 직접 상속 받아 스레드 생성
2. Runnable 인터페이스를 구현해서 생성
[Thread 클래스 이용]
- Thread 클래스로 부터 제공되는 run() 메소드 오버라이딩해서 사용
ex)
class ThreadA extends Thread{
public void run() { ... }
}
- 실제 사용
- ThreadA TA = new ThreadA();
TA.start();
- 현재의 클래스가 이미 다른 클래스로부터 상속 받고 있다면,
Runnable 인터페이스를 이용하여 스레드를 생성할 수 있다
- Runnable 인터페이스는 JDK 라이브러리 인터페이스이고 run() 메소드만
정의되어 있다
- run() 메소드가 종료하면 스레드는 종료된다
- 스레드를 계속 실행시키려면 run() 메소드를 무한루프 속에 실행되어야 한다
- 한번 종료한 스레드는 다시 시작시킬 수 없다
- 스레드 객체를 다시 생성해야 한다
- 한 스레드에서 다른 스레드를 강제 종료할 수 있다
<스레드의 상태 6가지>
- NEW : 스레드가 생성되었지만 스레드가 아직 실행할 준비가 되지 않았다
- RUNNABLE : 스레드가 실행되고 있거나 실행준비되어 스케쥴링을 기다리는 상태
- WAITING : 다른 스레드가 notify(), notifyAll()을 불러주기 기다리고 있는 상태(동기화)
- TIMED_WAITING : 스레드가 sleep(n)호출로 인해 n밀리미초 동안 잠을 자고 있는 상태
- BLOCK : 스레드가 I/O 작업을 요청하면 자동으로 스레드를 BLOCK상태로 만든다
- TERMINATED : 스레드가 종료한 상태
<Daemon Thread>
- 동일한 프로세스 안에서 다른 스레드의 수행을 돕는 스레드로,
다른 스레드를 서비스 해주면서 다른 스레드가 모두 종료되면
자신도 종료되는 스레드
- 프로그램이 종료되는 것을 막지 않으며 가비지 컬렉터나 메인 스레드가
데몬 스레드 이다
- 스레드를 생성하고 setDaemon(true)를 설정하면 된다
- 스레드가 시작하기 전에 설정해야 한다
<우선 순위(Priority)>
- 2개 이상의 스레드가 동작 중일 때 우선 순위를 부여하여 우선 순위가
높은 스레드에게 실행의 우선권을 부여할 수 있다
- 우선 순위를 지정하기 위한 상수를 제공
- static final int MAX_PRIORITY : 우선순위 10 - 가장 높은 우선 순위
- static final int MIN_PRIORITY : 우선순위 1 - 가장 낮은 우선 순위
- static final int NORM_PRIORITY : 우선순위 5 - 보통의 우선 순위
- 스레드 우선 순위는 변경 가능
- void setPriority(int priority)
- int getPriority()
- main() 스레드의 우선 순위 값은 초기값이 5
- JVM(Java Virtual Machine)의 스케쥴링 규칙
- 철저한 우선 순위 기반
- 가장 높은 우선 순위의 스레드가 우선적으로 스케쥴링
- 동일한 우선 순위의 스레드는 돌아가면서 스케쥴링(라운드 로빈)
<스레드 종료>
- 스스로 종료
- run() 메소드에 예외처리에 return을 넣어 스스로 종료
- 타 스레드에서 강제 종료
- interrupt() 메소드를 호출하면 InterruptedException이 발생
<Thread의 생성주기>
1. Runnable(준비)상태 : 쓰레드가 실행되기 위한 준비 단계
- CPU를 점유하고 있지 않으며 실행을 하기 위해 대기하고 있는 상태
- 코딩 상에서 start()메소드를 호출하면 run()메소드가 설정된 스레드가
Runnable상태로 진입
2. Runnin(실행)상태 : 스케줄러에 의해 선택된 쓰레드가 실행되는 단계
- CPU를 점유하고 있는 상태
- run()메서드는 JVM(Java Virtual Machine)만이 호출 가능
- 준비상태(Runnable)에 있는 여러 스레드 중 우선 순위를 가진 스레드가
결정되면 JVM이 자동으로 run()메소드를 호출하여 스레드가 Running 상태로 진입
3. Blocked(지연)상태 : 쓰레드가 작업을 완수하지 못하고 잠시 작업을 멈추는 단계
- CPU를 점유권을 상실한 상태
- 후에 특정 메소드를 실행시켜 Runnable(준비상태)로 전환
- wait() 메소드에 의해 Blocked 상태가 된 스레드는 notify()메소드가 호출되면
Runnable 상태로 간다
- sleep(시간) 메소드에 의해 Blocked 상태가 된 스레드는 지정 시간이 지나면
Runnable 상태로 간다
4. Dead(종료)상태
- Running 상태에서 스레드가 모두 실행되고 난 후 완료 상태
'JAVA' 카테고리의 다른 글
Properties, Thread - (2) (0) | 2023.03.04 |
---|---|
컬렉션(Collection) - (2) (0) | 2023.03.04 |
컬렉션(Collection) - (1) (0) | 2023.03.04 |