[JAVA]스레드
카테고리: JAVA
[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() 상태로 만듦
댓글 남기기