1. multi-threading
1)여러 thread가 동시에 수행되는 프로그래밍. 여러 작업이 동시에 실행되는 효과.
2)thread는 각각 자신만의 작업 공간을 가진다. -> context
3)각 thread 사이에는 공유하는 자원이 있을 수 있다. (자바에서는 static instance)
4)여러 thread가 자원을 공유하여 작업이 수행되는 경우 (멀티 쓰레드)
서로 자원을 차지하려는 race condition이 발생할 수 있다.
5)이렇게 여러 thread가 공유하는 자원 중 경쟁이 발생하는 부분을 critical section이라 한다.
6)critical section에 대한 동기화를 구현하지 않으면 오류가 발생할 수 있다.
2. 스레드 실행 제어 메서드
1)join( )
-다른 스레드의 종료를 기다림.
-동시에 두 개 이상의 Thread가 실행될 때 다른 Thread의 결과를 참조하여 실행해야 하는 경우
join( )함수를 사용.
-join( )함수를 호출한 Thread가 not-runnable 상태가 됨.
-다른 Thread의 수행이 끝나면 runnable 상태로 돌아옴.
2)intterrupt( )
-다른 Thread에 예외를 발생시키는 interrupt을 보냄.
-Thread가 sleep(시간), wait(),join()함수에 의해 Not runnable 상태일 때
interrupt()메서드를 호출하면 다시 Runnable 상태가 될 수 있음.
3) wait(), notify(), notifyAll()
-리소스가 어떤 조건에서 더 이상 유효하지 않은 경우 리소스를 기다리기 위해
Thread가 wait()상태가 됨. (Not Runnable)
-wait()상태가 된 Thread는 notify()가 호출될 때까지 기다림.
-유효한 자원이 생기면 notify()가 호출되고 wait()하고 있는 Thread 중 무작위로
하나의 Thread를 재시작하도록 한다. (Runnable)
-notifyAll()이 호출되는 경우 wait()하고 있는 모든 Thread가 재시작 됨.
->유효한 리소스만큼의 Thread만이 수행될 수 있고 자원을 갖지 못한 Thread의 경우 다시 wait()상태로 만듦.
=>자바에서는 notifyAll() 메서드 사용을 권장한다!!!
예제1. 학생은 6명, 책은 5권 -> 문제X
예제2. 학생은 6명, 책은 3권 -> 책을 못빌릴 경우에는 wait()을 호출하여 기다림.
책이 반납되어 빌릴 수 있게 될 경우 깨워주는 게 notify()임.
결과
예제3.
책을 못빌릴 경우에는 wait() 호출해서 기다림.
책이 반납되어 빌릴 수 있게 될 경우 깨워주는 게 notifyAll()임.
notify() => 스레드가 1개만 깨어나므로 경우에 따라서는 못깨어나는 경우도 있을 수 있음.
notifyAll() => 모두 다 깨어나게 됨. => 하나만 반납했는데 모두가 빌리는 상황이 되면 다시 문제가 됨.
'📒 education archive > 🎀JAVA' 카테고리의 다른 글
자바 공부 기록(15)-Comparator 와 Comparable, 예제 (0) | 2021.11.15 |
---|---|
[국비학원 기록/자바] 연결 리스트(Linked List) 종류, 구현, 노드 중간 데이터 추가 (0) | 2021.11.07 |
[국비학원 기록/자바] 쓰레드01. 프로세스, 스레드(Thread)장점, 단점,우선순위 (0) | 2021.10.31 |
[국비학원 기록/자바] 미니 프로젝트, 학점 산출 프로그램, 싱글톤 패턴 (0) | 2021.10.29 |
[국비학원 기록/자바] I/O 입출력, 입력 스트림, 출력 스트림, 기반 스트림, 보조 스트림 (0) | 2021.10.21 |