자바(JAVA)/미니 프로젝트 & 기초 공부

Java 기초 또 다시 공부하기 18일차 - 스레드(스레드 제어), 컬렉션 프레임워크

개발학생 2025. 7. 7. 11:46
반응형

1. 스레드(스레드 제어)

  • 스레드 객체를 생성하고 start() 메서드를 호출하면 언제든 실행할 준비가 되어 있는 '실행 대기 상태'가 됨
    -> 운영체제에서 실행 대기 상태 스레드 중 하나를 선택하여 '실행 상태'로 만드는 것
    • 실행 상태의 스레드는 run() 메서드를 모두 실행하기 전에 다시 실행 대기 상태로 돌아갈 수 있고,
      실행 대기 상태에 있는 다른 스레드가 선택되어 실행 상태가 되기도 함 
    • run() 메서드의 내용이 모두 실행되면 스레드의 실행이 멈추고 종료 상태가 됨

스레드 제어 과정 도식화

 

1) 스레드 상태 (Thread States)

  • 자바에서 Thread.State 열거형(Enum)은 총 6가지 상태를 정의
상태 설명
NEW  스레드 객체가 생성됐지만 아직 start()가 호출되지 않음
RUNNABLE 실행 준비 완료 상태(JVM이 스케줄링 시 CPU를 할당하면 실행됨)
BLOCKED 다른 스레드가 가진 락(lock)을 기다리는 상태
WAITING 특정 조건이 만족될 때까지 무한 대기 (wait() 등 사용 시)
TIMED_WAITING 일정 시간 동안 대기 (sleep(), join(timeout) 등)
TERMINATED  스레드가 정상적으로 종료되거나 예외로 인해 종료됨

2) 스레드 상태 제어: 실행 중인 스레드의 상태를 변경하는 것

  • 스레드 상태 제어 메서드
    -> 핵심:  sleep, join, interrupt
메서드  사용 시 상태 변화  설명
start() NEW → RUNNABLE 스레드를 시작하여 실행 대기 상태로 만듦
sleep(ms) RUNNABLE → TIMED_WAITING 지정된 시간 동안 실행 일시 중지
join() 현재 스레드 → WAITING or TIMED_WAITING 다른 스레드가 종료될 때까지 대기
wait() RUNNABLE → WAITING 모니터 락을 가진 객체에서 대기 상태로 진입
notify() / notifyAll() WAITING → RUNNABLE 대기 중인 스레드 깨움 (모니터 락 필요)
interrupt() TIMED_WAITING or WAITING → RUNNABLE or 예외 발생 대기 중인 스레드에 인터럽트 신호 전달
synchronized 블록 RUNNABLE → BLOCKED (경우에 따라) 락이 필요할 때 다른 스레드가 사용 중이면 
BLOCKED 상태로 진입

스레드 상태 제어 메서드를 활용하여 동시성 있는 작업을 구현한 예시: 자바 컴파일러 사이트

3) 데몬 스레드(daemon thread)

  • 주 스레드의 작업을 돕는 보조적 역할을 수행하는 스레드(사용자 작업과 직접 연관은 아님)
  • 일반 스레드와 달리 JVM 종료 조건 만족(데몬 스레드만 남으면 JVM 종료)
    -> 메인 스레드 종료 시 함께 종료되므로,
        중요한 작업(예: 파일 저장, 네트워크 통신 등)을 데몬 스레드에서 진행하면 작업 중단 가능성이 있어 위험
  • GC(가비지 컬렉터)JVM 내부 서비스가 주로 데몬 스레드 기반
  • 백그라운드 로깅, 자동 저장, 타이머 기능 등을 구현할 때 사용
  • 스레드 풀 또는 대기열 모니터링에서 관리용 작업 스레드로 사용

데몬 스레드 예시 코드: 자바 컴파일러 사이트 스레드는 비동기적으로 실행 되기 때문에 "데몬 스레드 시작" 이라는 로그가 백그라운드 작업 중... 보다 먼저 나올 수도 있고, 나중에 나올 수도 있음

2. 컬렉션 프레임워크(Collection Framework)

  • 자바는 널리 알려져 있는 자료구조(Data Structure)를 사용하여 객체들을 효율적으로 추가/삭제/검색 가능하도록,
    인터페이스와 구현 클래스를 java.util 패키지에서 '컬렉션 프레임워크'로 제공

1) List 컬렉션: 순서가 있는 데이터 집합

 

  • 요소들이 삽입 순서대로 저장
  • 중복 허용
  • 인덱스를 이용한 접근이 가능 (get(int index))

(1) 대표 구현 클래스

ArrayList  배열 기반, 빠른 조회, 동적 크기 조절 가능
LinkedList  노드 기반, 삽입/삭제에 강점
Vector  ArrayList와 유사하지만 동기화 지원

(2) 활용 예시

List 활용 예시: 자바 컴파일러 사이트

 

2) Set 컬렉션: 중복 없는 데이터 집합

  • 순서를 유지하지 않거나 정렬된 형태로 저장 (구현에 따라 다름)

(1) 대표 구현 클래스

HashSet  빠른 검색, 순서 미보장
LinkedHashSet  삽입 순서 유지
TreeSet  정렬된 형태로 저장 (Comparable 또는 Comparator 사용 가능)

(2) 활용 예시

Set 활용 예시: 자바 컴파일러 사이트

3) Map 컬렉션

 

  • 데이터를 Key → Value 형태로 저장
  • 키는 중복 불허, 값은 중복 가능
  • 키를 통해 빠르게 값 검색 가능

 

(1) 대표 구현 클래스

HashMap  가장 많이 쓰이는 Map, 빠른 검색, 순서 미보장
LinkedHashMap  삽입 순서 유지
TreeMap  키를 기준으로 정렬됨
Hashtable  동기화 지원, 레거시 클래스

(2) 활용 예시

Map 활용 예시: 자바 컴파일러 사이트

 

 

반응형