[33] 스레드
33.1. 프로세스 (Process)
- OS(Operating System)는 동시에 여러개의 프로그램이 실행됨.
- process
- 프로그램이 실행 중인 상태
- 프로그램이 실행 되면 OS부터 메모리를 할당받아 프로세스 상태가 됨.
33.2. 스레드 (Thread)
- 하나의 프로세스는 하나 이상의 thread를 가지게 됨
- 실제 작업(task)을 수행하는 단위는 thread임.
33.3. 멀티 스레딩 (Multi-Threading)
- 여러 thread가 동시에 수행되는 프로그래밍
- 여러 작업(task)이 동시에 실행되는 효과
- thread는 각각 자신만의 작업 공간을 가짐 (context)
- 각 thread 사이에서 공유하는 자원이 있을 수 있음
- static, instance
- 여러 thread가 자원을 공유하여 작업이 수행되는 경우 서로 자원을 차지하려는 race condition이 발생할 수 있음.
- critical section
- 여러 thread가 공유하는 자원중 경쟁이 발생하는 부분
- critical section에 대한 동기화(Synchronization)를 구현해야 함
- 구현하지 않으면 오류가 발생할 수 있음.
33.4. 자바 Thread 만들기
- Thread 클래스 상속
- Runnable 인터페이스 구현
- 람다식으로 Runnable 구현
- run()
33.5. Thread Status
Runn 상태
thread
/\
||
|| CPU 배분
|| sleep(), join(),wait()
start ==> Runnable 상태 --------------------------> Not Runnable 상태
thread thread thread thread
thread thread thread thread
thread thread thread sleep() -> 시간 지나면
|| join() -> other thread exits
|| wait() -> notify(), notifyAll()
|| <---------------------------
|| thread 종료
\/
Dead
33.6. Thread 클래스의 여러 메서드들
Thread 우선순위
- MIN_PRIORITY(=- ~ MAX_PRIORITY(=10)
- 디폴트 우선순위 : NORM_PRIORITY(=-
- 우선 순위가 높은 Thread가 CPU의 배분을 받을 확률이 높음
- getPriority() / setPriority(int newPriority)
join()
- 동시에 두 개 이상의 Thread가 실행 될 때, 다른 Thread의 결과를 참조하여 실행해야하는 경우 join() 함수를 사용.
- join()를 호출한 Thread가 not-Runnable 상태가 감.
- 다른 Thread의 수행이 끝나면 Runnable 상태로 돌아옴.
Thread 종료하기
- 무한 반복의 경우 while(flag)의 flag 변수값을 false로 바꾸어 종료를 시킴.
33.7. 멀티 Thread 프로그래밍에서 동기화
critical section
- 두 개 이상의 thread가 동시에 접근하고 경우 문제가 생길수 있음
- 그래서 동시에 접근할 수 없는 영역
thread1 get()[critical section] release() thread2 get() [critical section] release() thread3 get() [critical section] release()
- 한 순간 오직 하나의 thread만이 critical section을 얻을 수 있고, 나머지 thread들은 대기(blocking) 상태가 됨.
- 해당 thread만이 critical section에 들어갈수 있음.
동기화 (Synchronization)
두 개의 thread가 같은 객체에 접근할 경우, 동시에 접근함으로써 오류가 발생
동기화는 임계영역에 접근한 경우 공유자원을 lock하여 다른 thread의 접근을 제어
동기화를 잘못 구현하면 deadlock에 빠질수 있음
자바에서는 synchronized 메서드, synchronized 블럭을 사용
- synchronized 메서드
- deadlock을 방지하는 기술이 제공되지 않으므로 synchronized 메서드에서 다른 synchronized 메서드는 호출하지 않도록 함.
- synchronized 메서드
wait() / notify() 활용한 동기화
- 리소스가 어떤 조건에서 더 이상 유효하지 않은 경우 리소스를 기다리기 위해 wait() 메서드 이용함.
- wait() 상태가 된 Thread는 notify() 호출될 때까지 기다림.
- 유효한 자원이 생기면 notify()가 호출되고 wait()하고 있는 Thread 중 무작위로 하나의 Thread를 재시작 하도록 함.
- notifyAll()이 호출되는 경우 wait()하고 있는 모든 Thread가 재시작 됨.
- 이 경우 유효한 리소스만큼의 Thread만이 수행될 수 있음
- 자원을 갖지 못한 Thread의 경우는 다시 wait() 상태로 만듦
'JAVA' 카테고리의 다른 글
QA란? - 크로스 브라우저 테스팅, 테스팅 툴, 사이트 추천 (0) | 2023.04.16 |
---|---|
[JAVA]UML 종합 (0) | 2023.02.12 |
[JAVA]자바 IO (2) (0) | 2023.02.11 |
[JAVA]자바 IO (1) (0) | 2023.02.11 |
[JAVA]예외처리 (0) | 2023.02.10 |
댓글