산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> java

Java 멀티스레딩 완벽 해설: 개념, 생명주기, 실전 코드 예제

Java 애플리케이션은 종종 여러 작업을 동시에 수행해야 합니다. 이 튜토리얼은 단일 스레드 vs 멀티스레드 실행, 스레드 생명주기, 동기화 기법, 각 개념을 설명하는 실전 코드 예제를 안내합니다.

단일 스레드란?

Java에서 단일 스레드는 가장 작은 실행 단위입니다. Java 런타임은 애플리케이션 시작 시 사용자 스레드를 생성하며, 필요에 따라 추가 사용자 또는 데몬 스레드를 추가할 수 있습니다. 데몬 스레드는 백그라운드에서 실행되며 JVM 종료를 막지 않습니다.

단일 스레드 예제:

package demotest;
public class GuruThread {
    public static void main(String[] args) {
        System.out.println("Single Thread");
    }
}

단일 스레드 실행의 장점:

Java에서 멀티스레딩이란?

멀티스레딩은 두 개 이상의 스레드가 동시에 실행되게 하여 CPU 활용도를 극대화합니다. 스레드는 같은 메모리 공간을 공유하므로 컨텍스트 스위칭이 빠르고 메모리 사용량이 낮습니다.

두 개의 동시 스레드 생성 예제:

package demotest;
public class GuruThread1 implements Runnable {
    public static void main(String[] args) {
        Thread guruThread1 = new Thread("Guru1");
        Thread guruThread2 = new Thread("Guru2");
        guruThread1.start();
        guruThread2.start();
        System.out.println("Thread names are following:");
        System.out.println(guruThread1.getName());
        System.out.println(guruThread2.getName());
    }
    @Override
    public void run() {
        // 스레드 로직
    }
}

멀티스레딩의 이점:

Java 스레드 생명주기

스레드 생명주기는 다섯 가지 구분된 상태로 구성됩니다:

  1. New – 스레드 인스턴스화되었으나 시작 안 됨
  2. Runnable – 스레드 시작됨, 실행 준비 완료
  3. Running – 스레드 활발히 실행 중
  4. Waiting – 특정 이벤트 발생까지 일시 중단
  5. Dead – 스레드 실행 완료

Java 멀티스레딩 완벽 해설: 개념, 생명주기, 실전 코드 예제
Java 스레드 생명주기

주요 스레드 메서드

메서드설명
start()스레드 실행 시작; JVM이 run() 호출
sleep(long milliseconds)현재 스레드를 지정된 시간 동안 일시 정지
getName()스레드 이름 반환
setPriority(int newPriority)스레드 우선순위 조정 (1-10)
yield()스케줄러에게 현재 스레드 양보 제안

실전 스레드 예제

아래는 스레드 생성, 우선순위 조정, 슬립을 보여주는 간결한 예제입니다.

package demotest;
public class ThreadExample1 implements Runnable {
    @Override
    public void run() {
        // 스레드 작업
    }
    public static void main(String[] args) {
        Thread guruThread1 = new Thread();
        guruThread1.start();
        try {
            Thread.sleep(1000); // 1초 대기
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        guruThread1.setPriority(1);
        System.out.println(guruThread1.getPriority());
        System.out.println("Thread Running");
    }
}

출력 예:

Java 멀티스레딩 완벽 해설: 개념, 생명주기, 실전 코드 예제

스레드 동기화

여러 스레드가 공유 자원에 접근할 때 동기화는 데이터 일관성을 보장합니다. Java에서 synchronized 키워드로 임계 영역을 감싸면 독점적 접근을 보장합니다.

synchronized(object) {
    // 동기화 블록
}

고급 멀티스레딩 예제

아래는 두 스레드를 생성하여 각각 이름과 카운터를 1초 간격으로 출력하는 더 정교한 예제입니다.

package demotest;
public class GuruThread2 {
    public static void main(String[] args) {
        GuruThread3 threadGuru1 = new GuruThread3("guru1");
        threadGuru1.start();
        GuruThread3 threadGuru2 = new GuruThread3("guru2");
        threadGuru2.start();
    }
}
class GuruThread3 implements Runnable {
    private Thread guruthread;
    private String guruname;
    GuruThread3(String name) {
        this.guruname = name;
    }
    @Override
    public void run() {
        System.out.println("Thread running " + guruname);
        for (int i = 0; i < 4; i++) {
            System.out.println(i);
            System.out.println(guruname);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                System.out.println("Thread has been interrupted");
            }
        }
    }
    public void start() {
        System.out.println("Thread started");
        if (guruthread == null) {
            guruthread = new Thread(this, guruname);
            guruthread.start();
        }
    }
}

일반적인 출력 (동반 이미지 참조):

Java 멀티스레딩 완벽 해설: 개념, 생명주기, 실전 코드 예제

핵심 요약

java

  1. Java Hello World: 첫 프로그램 작성하기
  2. C++ 함수 완전 정복: 실전 코드 예제로 이해하기
  3. C# 컬렉션(Collections) 마스터하기: 실전 예제로 배우는 유연한 데이터 관리
  4. Java String.indexOf() 마스터: 부분문자열 위치 찾기 & 실전 예제
  5. Java String.charAt() 완전 이해: 문법, 반환타입, 예외, 실전 예제
  6. Java String compareTo() 마스터: 문법, 활용 케이스, 실전 예제
  7. Java 생성자 오버로딩: 실전 코드 예제로 이해하기
  8. 자바에서 소수 판별하기: 완벽 가이드
  9. 자바 삽입 정렬 알고리즘: 명확한 예제와 단계별 가이드
  10. 자바 선택 정렬: 단계별 예제와 전체 코드