열심히 끝까지
44강 스레드3 본문
<복습>
스레드
: 하나의 프로세스 안에서 두 가지 이상의 일을 하도록 하는 것
<용어 정리>
- 프로세스(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 |