Super Coding Addict
Ch15. 자바 Thread 프로그래밍 (2) 본문
< Thread의 여러가지 메서드 활용 >
* Thread status
- Thread가 Start되면, Runnable한 상태가 됨
- Runnable한 상태여야지만 CPU를 점유할 수 있음! [이 때, 스케줄러가 CPU를 배분해줌]
- Thread가 종료되면 Dead상태가 됨
- Dead가 아니지만, Not Runnable한 상태가 있다 (CPU 점유불가한 상태)
--> 3가지 자바 메서드(sleep(시간) / wait() / join() 메서드)를 호출한 경우로,
각각 시간이 지났을 때 / notify() 메서드 호출 / 조인을 건 다른 Thread가 끝나면 Runnable로 돌아온다
--> Runnable 상태로 못돌아오게 되는 좀비같은 상태에는?!
interrupt Exception으로 Exception 케이스로 떨어지게 해 빠져나올 순 있다
* Thread 우선 순위
- Thread.MIN_PRIORITY(=1) ~ Thread.MAX_PRIORITY(=10)
- 디폴트는 Thread.NORM_PRIORITY(=5)
- set, get으로 각각 우선순위 설정 or 우선순위 알아내기
setPriority(int NewPriorty)
int getPriority
- 우선순위가 높은 Thread가 CPU를 배분 받을 확률이 높지만, 확실한 큰 값을 줘야지 확실하게 우선순위를 줄 수 있음
- 예시 )
현재 돌고 있는 Thread를 가져오는 Thread의 static메서드 currentThread()를 실행한 후, toString으로 값을 찍어보면
다음과 같이 Thread[main, 5, main] 결과를 볼 수 있는데,
순서대로 [Thread이름, 우선순위, Thread가 속한 그룹]을 의미한다.
* join() 메서드
- 다른 Thread의 결과를 보고 진행해야하는 경우 활용
- join() 메서드를 호출한 thread가 not-runnable한 상태가 됨
--> Thread2가 끝나야지 not-runnable이었던 Thread1이 resume
- 예제
# JoinTest 클래스
package ch15.thread;
public class JoinTest extends Thread {
int start;
int end;
int total;
public JoinTest(int start, int end) {
this.start = start;
this.end = end;
}
public void run() {
int i;
for(i=start; i<=end; i++) {
total += i;
}
}
public static void main(String[] args) {
JoinTest jt1 = new JoinTest(1, 50);
JoinTest jt2 = new JoinTest(51, 100);
jt1.start();
jt2.start();
try {
jt1.join(); //join을 걸은 Thread는 main Thread!
jt2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int total = jt1.total + jt2.total;
System.out.println("jt1.total = " + jt1.total);
System.out.println("jt2.total = " + jt2.total);
System.out.println(total);
}
}
--> join을 걸지 않으면 원하는 결과가 나오지 않음
--> main이 join을 걸고 있으므로(호출) jt1과 jt2 Thread가 모두 종료된 후 main Thread가 resume
--> total값을 제대로 찍어볼 수 있게 된다