열심히 끝까지

44강 스레드3 본문

멘토씨리즈 JAVA

44강 스레드3

노유림 2022. 5. 10. 23:54

<복습>
스레드
하나의 프로세스 안에서 두 가지 이상의 일을 하도록 하는 것

<용어 정리>
프로세스(Process)              : 실행 중인 프로그램
스레드(Thread)                  : 프로세스에서 작업을 수행하는 것
- 멀티 스레드 프로세스(Multi-Thread Process)
                                         : 두 가지 이상의 작업을 하는 프로세스

[스레드 생성 방법]
- 자바 스레드로 작동할 작업이 무엇인지 코드로 작성
1) Thread 클래스 상속
2) Runnable 인터페이스 구현

스레드 코드가 실행할 수 있도록 JVM한테 요청
1) 인스턴스 생성 후 start() 호출
2) 인스턴스 생성 후 Thread() 매개변수 생성자에 인자값 전달, start() 호출

1) Thread 클래스 상속
class T1 extends Thread{
       public void run(){
              // 작업할 내용
       }
}

Th1 t1 = new Th1();
t1.start();
------------------------
2) Runnable 인터페이스 구현
class T2 implements Runnable{
       public void run(){
              // 작업할 내용
       }
}

Th2 t2 = new Th2();
Thread t = new Thread();

t.start();
------------------------------
<스레드의 생명주기(Thread Life Cycle)>
new Thread() -> new -> start() -> Runnable 
-> JVM Schaduler -> Running -> sleep() or join() 
-> Time_Waiting or Blocked -> unblocked -> Runnable
-> JVM Schaduler -> Running -> Dead

44-1 ) 스레드의 동기화
: 멀티 스레드로 작업 시, 스레드 간 작업이 서로 간섭이 되지 않도록 하는 것

멀티 스레드의 문제점?
멀티 스레드 기법은 자원을 공유하는데, 이 때 동시에 같은 자원을 처리한다면,
   자원 값이 실제 처리해야 하는 작업보다 더 많은 작업이 발생할 수 있다.

<실습>ShareBank
엄마랑 아들이 동시에 돈을 뽑는 작업을 스레드를 사용해 멀티태스킹으로 구현했을 때,
발생하는 문제를 실습을 통해 확인해보자.


--> 엄마가 돈을 뽑고 아들이 돈을 뽑는다면 
      2000원이 감소해야하는데, 감소가 되지 않는 것을 확인할 수 있다.

<실습>Synchronized1
한정된 티켓 수량을 멀티 태스킹으로 티켓팅을 했을 때, 
발생할 수 있는 문제점을 실습을 통해 확인하기.


--> 티켓 수량이 0 일 때만 티켓팅이 성공해야하므로 B, C는 티켓팅이 되면 안되나
      B가 티켓팅을 성공해, ticketNumber가 음수가 되는 것을 확인할 수 있다.
      이 이유는, 조건문을 걸어뒀으나, A가 티켓팅을 한 후, ticketNumber을 감소시키기 전에
      B의 티켓팅 코드가 통과했기 때문에 가능한 것을 볼 수 있다.

       => 따라서 이런 문제를 해결하기 위해, 스래드가 동시에 자원을 접근하는 것을 제한하는
            스레드 동기화 작업이 필요!

스레드 동기화(Thread Synchronized) 방법?
1) 동시에 작업하는 메서드에 synchronized 키워드 걸기
public synchronized void 메서드명(){
       // 수행할 작업
}

2) synchronized 영역 지정하기
void 메서드명(){
       synchronized(스레드객체){
              // 수행할 작업
       }
}

<실습>ShareBank, Synchronized1에 synchronized 붙이기
1) 동시에 작업하는 메서드에 synchronized 키워드 걸기


2) synchronized 영역 지정하기



44-2 ) wait() 와 notify()
동기화에서 발생할 수 있는 문제 상황을 해결하기 위해
  wait()와 notify() 사용 가능!

: 스레드를 대기시키는 wait()메서드와
  대기중인 스레드를 깨우는 notify()메서드를 통한
  스레드 제어 알아보기!

              메서드                                                  설명
       void wait()                                nofity()가 호출될 때까지 대기
       void wait(long timeout)               timeout 시간만큼 대기
       notify()                                     대기 중인 한 스레드만 깨움
       notifyAll()                                 대기 중인 모든 스레드를 깨움

<실습>Money1
mom 스레드는 통장객체에 돈을 입금하고, 
son 스레드는 통장객체에 돈을 출금하는 코드

실행 결과

'멘토씨리즈 JAVA' 카테고리의 다른 글

46강 입출력 / 자바의 IO 패키지  (0) 2022.05.11
45강 입출력 / 자바의 IO 패키지  (0) 2022.05.11
43강 스레드2  (0) 2022.05.10
42강 스레드1  (0) 2022.05.10
41강 컬렉션 프레임 웍 연습2 / 정렬(sort)  (0) 2022.05.10