코드스테이츠_국비교육/[Section1]

19.01_스레드_22.09.16

생각없이 해도 생각보다 좋다. 2022. 9. 17. 23:36

학습 키워드

  • 스레드
  • 싱글 스레드와 멀티 스레드
  • 스레드 생성 방법
  • 스레드 실행
  • 스레드 동기화
  • 스레드의 상태와 제어

 

스레드, Thread

>의미

: 프로세스 내에서 실행되는 소스 코드의 실행 흐름

: 운영체제로부터 프로세스가 제공받은 데이터와 컴퓨터 자원을 활용하는 하나의 실행 흐름

>프로세스

: 실행중인 프로그램

: 자원, 데이터, 스레드로 구성

>스레드 종류

  • 메인 스레드

: 시작점 스레드

: 프로그램이 시작될 때, 가장 먼저 시작되는 스레드

  • 작업 스레드

: 메인 스레드가 아닌 스레드

>프로그램  종류 (스레드에 따른)

  • 싱글 스레드 프로그램

: 메인 스레드 하나만 존재하는 프로그램

: 하나의 작업만 실행하는 프로세스

  • 멀티 스레드 프로그램

: 메인 스레드와 한 개 이상의 작업 스레드가 존재하는 프로그램

: 여러 작업을 동시에 할 수 있는 프로세스

: 멀티 태스킹 구현에 중요하다.


스레드의 활용

>의미

: 스레드가 수행할 코드를 작성하고 실행시키는 것을 활용한다고 함.

: 작업 스레드는 활용하려면 작업 스레드를 생성해야 함.

: 자바에서는 클래스 내부에 스레드 수행 코드를 작성하고, run()로 처리할 작업을 작성한다.

>스레드 활용법(생성 및 실행)

1. Runnable 인터페이스 구현해서 run() 구현

2. Thread 클래스 상속받아서 run() 구현

3. 익명 객체 사용

>Runnable 인터페이스 이용

1. Runnable 인터페이스를 구현하는 클래스를 만든다.

2. run() 메서드를 구현한다. (스레드가 작업할 내용)

3. main() 메서드에서 Runnable 인터페이스를 구현한 클래스의 인스턴스를 생성한다.

4. main() 메서드에서 Thread 클래스의 인스턴스를 생성하고 생성자에 인자로 3번의 참조변수를 제공한다.

5. 4에서 만든 참조변수에서 .strat()메서드를 작성하여 스레드를 실행한다.

6. 메인에서 실행된 스레드는 메인 스레드와 작업 스레드가 무분별하게 번갈아가며 실행된다.

>Thread 클래스를 상속받아서 활용

: Runnable 인터페이스를 이용하는 것과 모든 것이 똑같음

: 차이점은 메인에서 Thread의 인스턴스를 안 만들고, Thread클래스를 구현한 하위 클래스의 객체를 직접 사용한다는 점.

 

...? 이거 이전에 배운거랑 연관이 된다! 람다!!ㅋㅋ정확히는 익명 객체(추상화 메서드가 하나가 아닐 수 있으니

ㅋㅋ)

...? 어? Runnable은 함수형 인터페이스네?

 

>익명 객체를 이용한 스레드의 활용

>스레드 이름 조회 메서드

>스레드 이름 설정 메서드

>스레드 인스턴스 주소값 반환 메서드

 

스레드 동기화

>멀티 스레드의 문제

: 하나의 데이터에 두 개 이상의 스레드가 접근할 때, 병렬적으로 코드가 실행되기 때문에 문제가 발생함.

: 두 개 이상의 작업에서 하나의 데이터를 사용하기 때문에 혼선이 오고, 명확한 답을 도출할 수 없음

>임계 영역, Critical section

: 오로지 하나의 스레드만 코드를 실행할 수 있는 코드 영역

: synchronized 키워드 사용.

: 방법 1. synchronized 제어자로 사용 (메서드 전체 지정)

: 방법 2. 키워드로 사용, synchronized(this){ ... } (해당 여역이 포함된 객체, this에서 몸체{ ... } 부분을 영역으로 지정)

>락, Lock

: 임계 영역을 포함하고 있는 객체에 접근할 수 있는 권한

>임계 영역과 락

1. 임계 영역으로 지정된 객체 존재

2. 모든 다른 스레드에 의해 해당 객체가 작업이 이루어지지 않는다면, 스레드 01이 해당 객체에 대한 락을 획득

3. 임계 영역인 객체 내의 코드를 실행. 즉, 해당 객체를 작업

4. 작업이 끝나면 락 반환

5. 다른 스레드 02가 락 획득 및 임계 영역 객체 작업

6. 반복


스레드 상태와 실행 제어

>스레드 상태

  • 생성
  • 실행 대기
  • 실행
  • 일시 정지(TIMED_WAITING)
  • 소멸

>스레드 실행 제어 메서드

start()

: 스레드를 실행 대기 상태로 만듬

sleep(long milliSecond)

: 인자로 주어진 것 만큼 스레드 일시 정지

: 시간 경과 혹은 interrut() 호출 시 실행 대기 상태로 복귀

interrupt()

: 일시 정지 상태의 스레드를 대기 상태로 복귀