Thread 클래스의 여러 메서드들
- 우선순위 / join / Thread 종료하기
- priority / join() / while(!flag)
Thread PRIORITY - 우선순위
- Thread.MIN_PRIORITY(=1) ~ Thread.MAX_PRIORITY(=10) - 1~10까지 가능
- 디폴트 우선순위 : Thread.NORMAL_PRIORITY(=5)
- 우선순위가 높은 Thread가 CPU의 배분을 받을 확률이 높다
- 우선 순위가 높다고 반드시 먼저 수행이 된다는 것은 아님 X
- setPriority()/getPriority()
Thread 우선순위 예제
Thread 생성해주고 extends Thread
Thread 확인 메서드 currentThread( )


우선순위가 비슷비슷하기 때문에 예상 실행 순서 값이랑 다를 수 있음.
+ Thread에 우선순위 부여해주고 출력 test

극명하게 차이 나면 먼저 수행될 가능성 높아짐. 안 그럴 수도 있음.
join( )
- 동시에 두 개 이상의 Thread가 실행될 때 다른 Thread의 결과를 참조하여 실행해야 하는 경우 join() 함수를 사용
- join() 함수를 호출한 Thread가 not-runnable 상태가 감
- 다른 Thread의 수행이 끝나면 runnable 상태로 돌아옴
Join( ) 함수 예제
- 1부터 50, 51부터 100까지의 합을 구하는 두 개의 Thread를 만들어 그 결과를 확인해보세요
- extends Thread - 2개 값 받아주는 생성자와 더하는 기능 메서드 추가

출력 테스트
2개의 int 변수 가지는 객체 생성 후 run( )
돌릴 때마다 결과가 다르다. 수행되는 것이 있고 안 되는 것도 있고, 순서도 달라진다.
이유는?
프로그램을 시작하면 돌아가는 쓰레드 총 3개 ( main / jt1 / jt2 )
main 이 하는 일은 - jt1 / jt2 - 2개의 thread 생성해서 시작해주고 끝 - 제일 먼저 시작 제일 먼저 끝
lastTotal = 0 나오는 이유 : main thread 스타트되고 끝나서 결과 값을 찍는 순간에 다른 thread는 아직 수행이 안 끝남 - jt1 / jt2의 결과 값을 가져오지 못하고 0 출력 -
main Thread에서 필요한 것은 jt1 / jt2 Thread 다 돌아가고 난 뒤 그 값들을 가져와서 더한 total 값 필요한 것이다.
해결 법 - join( ) 필요
jt1.join() / jt2.join() -> main Thread 가 notRunnable 상태로 빠지고
jt1 / jt2 쓰레드 수행 끝나고 나면 main Thread가 돌아와서 그 값들을 가지고 나머지 수행
실행시킬 때마다 값도 안 변하고 / 각각의 메서드 잘 수행돼서 값 맞게 출력됨은 확인! GOOD :)
InterruptedException
-> NotRuannable 상태 쓰레드들이 Runnable 상태로 넘어오지 못하는 경우의 예외상황 처리
interrupt()
- 다른 Thread에 예외를 발생시키는 interrupt를 보낸다.
- Thread가 join(), sleep(), wait() 함수에 의해 not-runnable 상태일 때 interrupt() 메서드를 호출하면 다시 runnable 상태가 될 수 있음
- not-runnable 상태 Thread 가 돌아오지 못할 때 이 함수를 사용해서 기다리고 있던 쓰레드 돌아가게 해 준다. 정상적으로 수행되는 것은 아님
Thread 종료하기
- Thread를 종료할 때 사용함
- 무한 반복의 경우 while(flag)의 flag 변수값을 false로 바꾸어 종료를 시킴
Thread 종료하기 예제
세 개의 thread를 만든다.
각각 무한 루프를 수행하게 한다.
작업 내용 this.sleep(100);
‘A’ 를 입력 받으면 첫 번째 thread를
‘B’ 를 입력 받으면 두 번째 thread를
‘C’ 를 입력 받으면 세 번째 thread를
‘M’을 입력 받으면 모든 thread와 main() 함수를 종료한다.
Thread 생성
- extends Thread - 무한루프 while(!flag) { }
출력 테스트
- Thread 3개 만들어주고 시작
- while(true) 일 때 무한루프 종료되도록
M - A, C는 이미 끝난 상태라서
여러 가지 Thread 메서드들이 있는데 찾아보고 공부하기!
review
Thread의 메서드 몇 가지를 실습해보았다.
Priority / join() / while(!flag)
우선순위를 부여해서 원하는 작업을 먼저 실행시킬 확률을 높여주는 - Priority
다른 Thread의 결과 값을 참조할 경우 그 Thread가 종료될 때까지 NotRunnable 상태에 있다가 종료되면 Runnable상태로 돌아와서 참조하는 값을 가져와서 나머지 부분을 실행하게 해주는 join( )
Thread로 무한루프 돌릴 경우에는 while(!flag)로 돌려주고 종료시키려 할 때는 while(true) 경우 종료시키도록 핸들링 - Thread 종료하기
프로그램 - 프로세스 - Thread
점점 컴퓨터의 영역으로 다가가고 있는 느낌을 받았다.
어떤 코드를 써야 하나 함수를 사용해야 하나 고민뿐 아니라
그것들을 어떤 우선순위로 실행시켜줄지와 서로의 참조 관계를 파악해서
실행 순서를 조절해 주는 것도 고민해야 되는 부분이었다.
점점 컴퓨터의 언어에 다가간다는 느낌을 Thread 메서드들 실습하면서 느낄 수 있었다.
'JAVA 웹 개발 패키지 - 패스트캠퍼스 > Chapter6' 카테고리의 다른 글
wait( ) / notify( ) 메서드 (0) | 2022.02.05 |
---|---|
멀티 Thread 프로그래밍에서의 동기화 (0) | 2022.02.02 |
자바에서 Thread 만들기 (0) | 2022.01.28 |
데코레이터 패턴예제 실습 ) 커피 머신 프로그램 (0) | 2022.01.27 |
직렬화 (serialization) (0) | 2022.01.25 |