Thread
0. 개요
1. 스레드 기본
2. Thread Life Cycle
3. 문제점
4. 스레드 구현
0. 개요
- 스레드를 이해하기 위해 유사한 개념인 멀티 태스킹을 알아보자
<멀티 태스킹>
1. 스레드 기본
<멀티 스레드>
- start()는 내부적으로 run()를 호출하고 main method부터 끝낸다
- start()가 있다면 run()를 스레드 스케줄러에 올릴 수 있음
- 스레드 장점: O/S자원을 공유
- 스레드 단점: 데이터 공유 - 공유때문에 동기화 문제가 발생
2. Thread Life Cycle
<스레드 라이프 사이클: sleep pool>
<멀티 큐 구조>
※ runnable1과 2는 순차적으로 도는 것이 아니라 누가 먼저 도는지 누가 늦게 도는지 알 수 없음 = 스레드는 제어할 수 없음
단, sleep()를 이용해서 일부 제어가 가능: 일정기간 동안 실행 중지(속도조절)
1) start()에 의해 main method가 시작, 진행
2) runnable1이 뒤이어 스레드 스케줄러를 통해 run()로 이동
3) 이후 runnable1이 sleep pool에 들어가고 main method는 끝남
4) 다시 runnable로 runnable1이 이동
3. 문제점: 동기화 문제
1) data를 잘못 건들이면 신뢰 문제가 발생
예) 30명의 학생이 문서 1개를 공유: 누가 언제 수정했는지 알 수 없고 수정한 내용이 뒤죽박죽됨 - key를 부여해서 1명에게 수정권한을 부여해야 해결
2) overhead 발생
- synchronized block: synchronized keyword를 통해 cycle을 다 돌기 전에 다른 인스턴스는 대기
- deadlock(교착상태): 코드는 정상적으로 돌아가나 사용자가 보기에 시스템이 죽은 것처럼 보임
4. 스레드 구현
<스레드를 구현하는 두 가지 방식>
- runnable 인터페이스는 run()만 보유 -> 스레드 스케줄러로 갈 수 있는 start()가 없음
- start() 호출을 위해 thread 클래스로 객체를 선언 -> thread 생성자를 생성, start() 호출