Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

Super Coding Addict

Ch15. 자바 Thread 프로그래밍 (2) 본문

카테고리 없음

Ch15. 자바 Thread 프로그래밍 (2)

밍응애 2021. 2. 14. 14:49

< 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값을 제대로 찍어볼 수 있게 된다