1.멀티스레드
멀티 데스킹을 가능하게 하기 위해 만들어졌다.
O.S가 만든 thread : kernel thread -
개발자가 만든 thread : user thread
**Thread란
:실행코드를 실행시킨다.
:불확실성의 원칙을 가진다.
2.스레드 생성과 실행
3.스레드 우선 순위
-동시성
:하나의 코어(CPU)에서 멀티 스레드가 번갈아 가며 실행하는 성질
:Thread1이 끊기도 다음으로 넘어갈때 끊어짐이 없는 것은 Core가 아주 빠르기 때문이다.
-병렬성
:멀티 코어에서 개별 스레드를 동시에 실행하는 성질
:이상적인 형태이다.
:상황에 따라 동시성과 병렬성을 섞어서 쓴다.
**스레드 스케줄링
:스레드의 실행순서를 조절해준다.
:하지만 잘 안된다. (locking을 해도 다른 스레드가 들어온다.)
-우선 순위(Priority) 방식
:우선 순위가 높은 스레드가 실행 상태를 더 많이 가져간다. (1~10)
:코드로 제어 할 수 있다.
-순환 할당(Round-Robin) 방식
:스레드가 돌아가면서 시간 할당량(Time Slice)을 받아 그만큼 실행
:코드로 제어할 수 없다.
ex)
4.동기화(synchronized)
:앞의 스레드가 끝날때까지 기다려야하는 단점이 있다.
:한 개의 스레드는 출력 전까지 객체에 locking을 걸어 놓는다.
:따라서, 끝나고 반드시 unlocking을 해야 한다.
동기화를 사용하지 않은 경우,
위 그림처럼 User1은 출력값을 잘못된 것으로 받는다.
동기화를 사용하는 경우,
하나의 스레드가 끝나고 다음이 실행된다.
-동기화 방법
1)동기화 메소드
: 메소드에 동기화 한다.
: 메소드가 끝날때까지 다음 스레드로 넘어갈 수 없다.
public synchronized void method(){
//단 하나의 스레드만 실행
}
2)동기화 블록
: 블록에다가 동기화한다.
public void method() {
//여러 스레드가 실행 가능 영역
synchronized(공유객체) {
//임계 영역(critical section)의 단점 커버
}
}
임계영역: 경쟁상태(경쟁조건)=race condition이 일어나는 영역으로
여러 스레드가 실행된다.
중요한 것은 동기화의 위치를 잘 선정해야 한다는 것이다!!!
5.스레드 상태
-스레드 일시 정지 상태일때
Thread는 enum상태로 받는다.(열거 상수)
-Blocked
:대부분은 공유 객체(synchronized가 되어 있는) 객체가 monitor lock 상태이다.
-Waiting
:이 세가지 메소드를 호출할때 waiting 상태가 된다.
:스레드가 잠기면 스스로 깨어나지 못한다.
-Timed waiting
:이 5가지 메소드를 호출할때 Timed waiting 상태가 된다.
:설정된 시간이 되면 스레드 스스로 깨어난다.
Thread.sleep() with no timeout
Object.wait() with no timeout
Thread.join() with no timeout
LockSupport.parkNanos()
LockSupport.pakrUntil()
6.스레드 상태 제어
-join()
join은 스레드를 일시정지 시키는데 실행중인 스레드가 끝날때까지 기다린다.
ex)
SumThread - JoinExample(실행 클래스)
1부터 100까지 더해지는 메소드가 담긴 스레드 클래스를 만든다.
sumThread.join()을 통해 메인스레드가 sumThread의 계산이 끝날때까지 기다리게 된다.
**스레드 협업
-wait(), notify(), notifyAll()
7.스레드 풀
-스레드 생성
-newCachedThreadPool
-newFixedThreadPool은 코어 스레드수와 최대 스레드수가 같으므로 Shrink가 없다.
Shrink : 스레드 수가 최대로 갔다가 줄어드는 것을 뜻함.
메소드 호출시에도
1)동기식(blocking)== Sync방식
:스레드 하나가 다 실행함.
2)비동기식(non-blocking)==Async방식
:블락이 걸려도 다른 스레드가 실행함.
:다른 스레드에게 잠시 맡기고 다른 걸 실행.
댓글