dnjsrms.log
로그인
dnjsrms.log
로그인
[Java]Thread
dnjsrms.lee
·
2022년 6월 3일
팔로우
0
Java
Thread
0
Java
목록 보기
14/14
쓰레드(Thread)
멀티 쓰레드 프로그래밍 : 여러개의 쓰레드가 동시에 돌아가는 상황 → 생길 수 있는 문제, 어떻게 해결해야 할까?
프로그램이 메모리에 올라 간 상태 : process / 실행이 되기 위해서는 cpu를 점유해야 함
하나의 프로세스가 수행이 되기 위해서는 쓰레드가 하나 생기게 됨.
가끔 하나의 프로그램에서 두개의 쓰레드가 생길 때가 있음. → 쓰레드 2개가 서로 스위치되면서 cpu의 스케줄러가 쓰레드를 배분해주는 것
context : 쓰레드는 각각 자신만의 작업 공간이 있음.
동시에 공유하는 자원이 있을 수 있음. 이것을 Shared Resource라고 함(자바에서는 주로 static 개체가 될 것 / C는 global 변수가 될 수 있음)
이러한 공유하는 자원 중 경쟁이 일어날 수 있는데 이 부분을 critical section이라 함
공유 자원에 대해서는 보호를 해줘여 함. <임계영역> - 누가 사용할 때는 다른 쓰레드는 사용하지 못하게끔, 순차적으로 사용하게하는 기법이 필요함(→ 동기화를 구현해주어야 함 - 자바에서는 Synchronized Block, Synchronized method)
쓰레드 만드는 방법
thread class에서 extends 받아서 만드는 방법
이미 다른 class에서 상속을 받았을 때는 runnable interfacer를 implements하는 방법
쓰레드 우선순위
PRIORITY는 1~10
그냥 thread만들면 normal ⇒ 5
우선순위가 높은 thread가 CPU 배분을 받을 확률이 높음
join()
동시에 두 개 이상의 Thread가 실행 될 때 사용
1번 쓰레드가 2번 쓰레드에게 join()을 걸게 되면 1번 쓰레드는 Non-Runnable상태로 빠졌다가 2번 쓰레드가 다 끝나면 다시 Runnable상태로 돌아옴
join(), wait(), sleep() → InterruptedException
Thread가 join(), sleep(), wait() 함수에의해 not-runnable 상태일 때 interrupt() 메서드를 호출하면 다시 runnable 상태가 될 수 있음
Thread 종료
무한 반복 일 때 while(flag)의 flag변수 값을 false로 바꿔 종료
멀티 쓰레드 프로그래밍
critical section & semaphore
critical section은 두 개 이상의 thread가 동시 접근 할 때 문제가 생길 수 있기에 동시 접근을 제한하는 영역
semaphore는 특별한 형태의 시스템 객체. get/release 두 개의 기능 존재
`get()` `critical section` `release()` ⇒ 동시 접근 불가
semaphore를 가진 thread만이 critical section에 들어갈 수 있음
동기화 (synchronization)
임계영역에 접근한 경우 Shared Resource를 lock하여 다른 thread접근 제한
잘못 구현하면 deadlock에 빠질 수 있음
synchronized 블럭 & synchronized 메서드
synchronized 블럭
현재 객체 또는 다른 객체를 lock으로
객체를 쓰는데 동기화가 필요하다 → Block
synchronized
(
참조형 수식
)
{
수행문
;
}
synchronized 메서드
객체의 메서드에
synchronized
사용
그 메서드가 속해있는 객체에 lock → (this)
deadlock 주의 : synchronized 메서드에서 다른 synchronized 메서드호출 X
전반적으로 이 클래스가 다 동기화를 지원해야 한다 → 다 synchronized 사용하면 됌
wait() / notify() 메서드 활용한 synchronization
wait()상태가 된 Thread는 notify()가 호출 될 때까지 기다림
notifyAll()이 호출되는 경우 wait() 하고 있는 모든 Thread가 재시작 → 모두다 깨워 경쟁상태가 되는 것이 공평(notifyAll() 메서드의 사용을 권장)
dnjsrms.lee
little by little slowly
팔로우
이전 포스트
[Java]I/O Stream
0개의 댓글
댓글 작성