Languages/Java

[HUFS/객체지향프로그래밍] #11 스레드

성중 2023. 1. 6. 17:05

스레드

실행 중인 하나의 애플리케이션을 프로세스(process)라고 하며, 애플리케이션이 실행되면 운영체제로부터 실행에 필요한 메모리를 할당 받아 코드를 실행한다

 

멀티 프로세스 가능 (프로세스 하나가 오류 나도 서로 영향 X)

운영 체제는 CPU 및 메모리 자원을 병렬로 할당하는 멀티 태스킹이 가능한데, 각 프로세스는 순차적으로 실행할 코드 이름인 스레드(thread)를 병렬로 실행할 수 있다

 

멀티 스레드 가능 (스레드 하나가 오류 나면 프로세스 오류)

메인 스레드

모든 자바 애플리케이션은 메인 스레드가 main() 메소드를 실행하며 시작된다

 

필요에 따라 멀티 스레드를 생성해 병렬로 코드 실행
모든 스레드가 종료되어야 프로세스 종료

작업 스레드

멀티 스레드 애플리케이션을 개발하려면 몇 개의 작업을 병렬로 실행할 지 결정한 뒤 각 작업별로 클래스를 상속/생성해서 작업 스레드를 객체화해 사용해야 한다

 

메인 스레드와 작업 스레드
java.lang.Thread 클래스로부터 직접 생성 1
java.lang.Thread 클래스로부터 직접 생성 2
java.lang.Thread 클래스로부터 직접 생성 3
Thread 하위 클래스로부터 생성 1
Thread 하위 클래스로부터 생성 2
스레드의 이름

동기화 메소드

멀티 스레드 프로그램에서 스레드들이 객체를 공유해 작업하면 예상치 못한 결과가 나올 수 있다

 

공유 객체

스레드가 사용 중인 객체를 다른 스레드가 변경할 수 없도록 사용 중인 객체에 잠금을 걸 수 있다

  • 임계 영역(critical section): 단 하나의 스레드만 실행할 수 있는 코드 영역
  • 동기화(synchronized) 메소드: 스레드가 객체 내부의 동기화 메소드를 실행하면 즉시 객체 잠금

 

동기화 메소드 (메소드 전체 내용이 임계 영역)
객체 중 하나의 동기화 메소드만 실행 중 이어도 다른 스레드는 일반 메소드만 접근 가능
동기화 메소드 실행 종료 시 잠금 해제

스레드 상태

스레드 상태

  • 실행 대기(runnable) 상태: 스레드 객체를 생성 후 start() 메소드를 호출한 직후의 상태
  • 실행(running) 상태: 실행 대기 상태의 스레드 중 운영체제가 하나를 선택해 CPU가 run() 메소드를 실행한 상태로 메소드를 모두 실행하기 전에 다시 실행 대기 상태로 돌아갈 수도 있음
  • 종료(terminated) 상태: 실행 상태에서 run() 메소드가 종료되어 스레드 실행이 정지된 상태

 

3 가지 상태를 오가며 실행
스레드 상태 제어 메소드
sleep() 메소드는 스레드를 주어진 시간 동안 일시 정지
stop 플래그를 이용해 스레드의 안전한 종료
interrupt() 메소드는 일시 정지 상태에서 InterruptedException을 발생시켜 안전한 종료 유도
스레드의 일시 정지 상태 여부를 확인하는 메소드

데몬 스레드

주 스레드의 작업을 돕는 보조 스레드를 데몬 스레드라 하며, 주 스레드 종료 시 같이 종료된다

 

데몬 스레드 설정