2025/06/27 14

쓰레드 동기화

자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다.쓰레드의 동기화 (synchronization)핵심 개념:동기화(synchronization)란?➜ 멀티 쓰레드 환경에서 공유 자원을 동시에 여러 스레드가 접근하면 문제가 생기므로,하나의 스레드만 작업하도록 제한하는 것.설명 내용:멀티 쓰레드 환경에서는 다른 스레드의 작업이 현재 작업에 영향을 줄 수 있다.이를 막기 위해, 특정 코드 구간을 "임계 영역 (critical section)"으로 설정해야 함.임계 영역에는 lock(자물쇠)을 걸고, 이 자물쇠를 획득한 스레드만 출입 가능.그림 설명처럼 객체 하나마다 락 하나가 걸리고, 그 락을 가진 스레드만 임계 영역 접근 가능.비유:하나의 방(객체)에 한 사람(스레드)만 들어갈 수 있도록 자물쇠를 채우..

Java 2025.06.27

join(), yield()

자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다. join() 메서드join()은 특정 쓰레드가 종료될 때까지 기다리는 메서드입니다.설명 요약join()→ 쓰레드가 종료될 때까지 기다림 (예: th1.join()이면 main 쓰레드는 th1이 끝날 때까지 기다림)join(long millis)→ 최대 millis 밀리초 동안만 기다림join(long millis, int nanos)→ millis 밀리초 + nanos 나노초 동안만 기다림예외 처리join() 중간에 다른 쓰레드가 interrupt() 하면 InterruptedException 발생 → 반드시 try-catch로 감싸야 함.코드 흐름th1.start(); // A쓰레드th2.start(); // B쓰레드th1.join(); ..

Java 2025.06.27

suspend(), resume()

자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다.메서드 개요suspend()스레드 실행을 일시정지 시킴 (blocked/waiting 상태로 빠짐)resume()suspend()에 의해 멈춘 스레드를 다시 실행대기 상태로 복귀시킴stop()스레드의 실행을 즉시 종료시킴→ 현재는 모두 deprecated (비추천)이유는 아래와 같습니다. Deprecated(사용금지 권고)된 이유suspend()만 호출되고 resume()이 호출되지 않으면 스레드가 영원히 깨어나지 못함 → 교착 상태(deadlock) 발생 가능성stop()은 스레드 실행 중간에 강제로 종료시키므로 자원 정리, 락 해제 없이 종료 → 프로그램 불안정이러한 이유로 자바 1.2 이후부터는 사용 금지되고, 직접 제어할 수 있도록 논리 플래..

Java 2025.06.27

sleep(), interrupt()

자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다.sleep() 메서드 설명핵심 개념Thread.sleep()은 현재 쓰레드를 일정 시간 동안 멈추게(잠자게) 하는 메서드입니다.정적 메서드(static)이므로 Thread.sleep()처럼 클래스 이름으로 호출합니다.다른 쓰레드를 지정해서 멈추게 할 수는 없습니다. 자기 자신만 멈출 수 있습니다.메서드 정의static void sleep(long millis)static void sleep(long millis, int nanos)millis는 천분의 1초 (즉, 밀리초 단위)nanos는 10억분의 1초 (즉, 나노초 단위)예시: sleep(3 * 1000) → 3초 동안 멈춤⚠️ 예외 처리 필수sleep()을 사용하면 반드시 try-catch로 감..

Java 2025.06.27

쓰레드의 상태

자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다. 쓰레드 상태 목록NEWstart()가 호출되지 않은 초기 상태RUNNABLE실행 중이거나 실행 가능한 상태 (CPU 스케줄 대기 중)BLOCKED동기화 블록에 의해 일시 정지된 상태 (lock이 풀릴 때까지 기다림)WAITING / TIMED_WAITING실행할 수 없지만 종료되지 않은 상태WAITING은 무기한 대기, TIMED_WAITING은 제한된 시간만 대기TERMINATED쓰레드 실행이 종료된 상태 상태 간 전이상태 전이 흐름:NEW → RUNNABLE: start() 호출 시 실행 대기 상태로 진입RUNNABLE → 실행: 스케줄러에 의해 선택되면 실행됨RUNNABLE → 일시정지 상태:sleep(), wait(), join() 호출 시..

Java 2025.06.27

데몬 쓰레드

자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다. 데몬 쓰레드 개념데몬 쓰레드데몬 쓰레드란?일반 쓰레드(non-daemon thread)의 작업을 도와주는 보조 쓰레드입니다.예: 가비지 컬렉터(GC), 자동 저장, 자동 백업 등특징일반 쓰레드가 모두 종료되면 → 데몬 쓰레드는 자동 종료됩니다.즉, 보조 역할이라 메인 작업이 끝나면 같이 끝나는 것용도백그라운드에서 반복적으로 수행해야 하는 작업들에 적합예시: 무한 루프 속에서 주기적으로 작업 수행 (→ 코드 예시 참고)public void run() { while (true) { try { Thread.sleep(3 * 1000); // 3초마다 대기 } catch (InterruptedException e) {} ..

Java 2025.06.27

쓰레드 그룹

자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다. 쓰레드 그룹핵심 개념 요약쓰레드를 그룹으로 묶는 이유: 관련 있는 쓰레드를 한 그룹으로 묶어서 일괄 처리하거나 관리하기 위함입니다.모든 쓰레드는 반드시 하나의 쓰레드 그룹에 속해야 함:쓰레드 그룹을 명시하지 않으면 기본적으로 main 쓰레드가 속한 그룹에 자동 포함됩니다.자식 쓰레드는 부모 쓰레드의 그룹과 우선순위를 상속받습니다.생성자 형태Thread(ThreadGroup group, String name)Thread(ThreadGroup group, Runnable target)Thread(ThreadGroup group, Runnable target, String name)Thread(ThreadGroup group, Runnable targe..

Java 2025.06.27

쓰레드 우선순위

자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다. 쓰레드 우선순위란?Thread 클래스는 쓰레드에 우선순위(priority)를 부여할 수 있습니다.우선순위는 CPU 스케줄링 시 누가 더 먼저 CPU를 배정받을지에 영향을 주는 값입니다.하지만, 필수도 아니고 절대적인 것도 아님 → 우선순위가 높다고 꼭 먼저 실행되는 것은 아님! 우선순위 설정/조회 메서드setPriority(int newPriority)쓰레드의 우선순위를 설정getPriority()쓰레드의 현재 우선순위 조회 우선순위 값의 범위MAX_PRIORITY = 10최댓값 (가장 높은 우선순위)NORM_PRIORITY = 5기본값 (보통)MIN_PRIORITY = 1최솟값 (가장 낮은 우선순위)JVM(Java Virtual Machine)..

Java 2025.06.27

I/O 블로킹

자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다. I/O 블로킹이란?I/O는 Input/Output, 즉 사용자 입력 또는 출력 같은 작업입니다.자바에서 JOptionPane.showInputDialog() 같은 입력 함수는 사용자의 입력을 기다리는 동안 아무 일도 하지 않고 멈춥니다 → 이것이 블로킹(Blocking) 현상입니다. 싱글 쓰레드 I/O 블로킹class ThreadEx6 { public static void main(String[] args) { // (A) 사용자에게 입력받음 (blocking 발생) String input = JOptionPane.showInputDialog("입력하세요..."); System.out.println("입력..

Java 2025.06.27

싱글 쓰레드와 멀티 쓰레드

자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다. main 쓰레드main 쓰레드란?자바 프로그램에서 main() 메서드를 실행하는 기본 쓰레드이 쓰레드는 프로그램 시작과 동시에 만들어져 main()의 코드를 실행함쓰레드의 종류자바에서는 쓰레드가 2종류로 나뉩니다:사용자 쓰레드일반적으로 우리가 생성하는 쓰레드 (main, new Thread(...))데몬 쓰레드백그라운드에서 동작하는 보조 쓰레드 (ex. GC 쓰레드) 프로그램 종료 조건"실행 중인 사용자 쓰레드가 하나도 없을 때 프로그램은 종료된다."즉, 데몬 쓰레드가 아무리 남아 있어도,사용자 쓰레드가 전부 종료되면 프로그램은 끝납니다.main 쓰레드 = 사용자 쓰레드사용자 쓰레드가 다 끝나면 = 프로그램 종료call stack에 run()이 ..

Java 2025.06.27