본문 바로가기
JAVA

[JAVA 개념10] 멀티 스레드(Multi Thread)

by 자유데이터 2018. 11. 13.
반응형

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 상태가 된다.
:스레드가 잠기면 스스로 깨어나지 못한다.
  • Object.wait() with no timeout
  • Thread.join() with no timeout
  • LockSupport.park()

-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방식
:블락이 걸려도 다른 스레드가 실행함.
:다른 스레드에게 잠시 맡기고 다른 걸 실행.



















반응형

'JAVA' 카테고리의 다른 글

[JAVA 개념12] IO기반 입출력 및 네트워킹  (0) 2018.11.13
[JAVA 개념11] 스트림(Stream)  (0) 2018.11.13
[JAVA 개념 9] 람다식  (0) 2018.11.13
[JAVA 개념8] 제네릭  (0) 2018.11.13
[JAVA 개념7] 컬렉션 프레임워크3 (Map)  (0) 2018.11.13

댓글