JAVA

쓰레드(Thread)란?

jki09871 2024. 7. 25. 16:42

1. 쓰레드란?

쓰레드는 하나의 프로그램 내에서 동시에 실행될 수 있는 작은 실행 단위입니다. 프로그램이 여러 작업을 동시에 처리할 수 있도록 도와줍니다.

2. 쓰레드 사용 이유

쓰레드를 사용하는 이유는 다음과 같습니다:

  • 병렬 처리: 여러 작업을 동시에 처리하여 성능을 향상시킵니다.
  • 응답성 향상: 긴 작업이 실행되는 동안에도 사용자 인터페이스가 계속 응답할 수 있도록 합니다.

3. 싱글 쓰레드

싱글 쓰레드는 하나의 작업만 순차적으로 처리합니다.

예제 코드 (싱글 쓰레드)

public class SingleThreadExample {
    public static void main(String[] args) {
        // 작업 1: 숫자 세기
        for (int i = 1; i <= 5; i++) {
            System.out.println("Counting: " + i);  // 숫자를 출력
            try {
                Thread.sleep(1000); // 1초 대기 (1000밀리초)
            } catch (InterruptedException e) {
                e.printStackTrace(); // 예외 발생 시 스택 트레이스 출력
            }
        }

        // 작업 2: 알파벳 출력
        for (char c = 'A'; c <= 'E'; c++) {
            System.out.println("Alphabet: " + c);  // 알파벳을 출력
            try {
                Thread.sleep(1000); // 1초 대기 (1000밀리초)
            } catch (InterruptedException e) {
                e.printStackTrace(); // 예외 발생 시 스택 트레이스 출력
            }
        }
    }
}

코드 설명

이 코드는 두 가지 작업(숫자 세기와 알파벳 출력)을 순차적으로 실행합니다.

  1. 숫자 세기: 1부터 5까지의 숫자를 출력하며, 각 숫자 사이에 1초의 대기 시간을 둡니다.
  2. 알파벳 출력: 'A'부터 'E'까지의 알파벳을 출력하며, 각 알파벳 사이에 1초의 대기 시간을 둡니다.

장점

  • 구현이 간단하고 직관적입니다.
  • 동기화 문제를 걱정할 필요가 없습니다.

단점

  • 여러 작업을 동시에 처리할 수 없어서 비효율적일 수 있습니다.
  • 긴 작업이 진행되는 동안 프로그램의 다른 부분이 블로킹될 수 있습니다.

4. 멀티 쓰레드

멀티 쓰레드는 여러 작업을 동시에 처리합니다.

예제 코드 (멀티 쓰레드)

class NumberThread extends Thread {
    public void run() {
        // 숫자 세기
        for (int i = 1; i <= 5; i++) {
            System.out.println("Counting: " + i);  // 숫자를 출력
            try {
                Thread.sleep(1000); // 1초 대기 (1000밀리초)
            } catch (InterruptedException e) {
                e.printStackTrace(); // 예외 발생 시 스택 트레이스 출력
            }
        }
    }
}

class AlphabetThread extends Thread {
    public void run() {
        // 알파벳 출력
        for (char c = 'A'; c <= 'E'; c++) {
            System.out.println("Alphabet: " + c);  // 알파벳을 출력
            try {
                Thread.sleep(1000); // 1초 대기 (1000밀리초)
            } catch (InterruptedException e) {
                e.printStackTrace(); // 예외 발생 시 스택 트레이스 출력
            }
        }
    }
}

public class MultiThreadExample {
    public static void main(String[] args) {
        NumberThread numberThread = new NumberThread();  // 숫자 세기 쓰레드 생성
        AlphabetThread alphabetThread = new AlphabetThread();  // 알파벳 출력 쓰레드 생성

        numberThread.start();  // 숫자 세기 쓰레드 시작
        alphabetThread.start();  // 알파벳 출력 쓰레드 시작
    }
}

코드 설명

이 코드는 두 가지 작업(숫자 세기와 알파벳 출력)을 동시에 실행합니다.

  1. NumberThread 클래스: 숫자 세기 작업을 수행하는 쓰레드입니다. 1부터 5까지의 숫자를 출력하며, 각 숫자 사이에 1초의 대기 시간을 둡니다.
  2. AlphabetThread 클래스: 알파벳 출력 작업을 수행하는 쓰레드입니다. 'A'부터 'E'까지의 알파벳을 출력하며, 각 알파벳 사이에 1초의 대기 시간을 둡니다.
  3. MultiThreadExample 클래스: NumberThread와 AlphabetThread를 생성하고, start() 메소드를 호출하여 두 쓰레드를 동시에 실행합니다.

장점

  • 여러 작업을 동시에 처리하여 성능을 향상시킬 수 있습니다.
  • 사용자 인터페이스가 더 부드럽고 반응성이 좋아집니다.

단점

  • 동기화 문제에 주의해야 합니다.
  • 쓰레드 관리가 복잡할 수 있습니다.

5. 싱글 쓰레드와 멀티 쓰레드의 차이

  • 처리 방식:
    • 싱글 쓰레드: 하나의 작업이 끝나야 다음 작업을 시작합니다. 순차적으로 처리됩니다.
    • 멀티 쓰레드: 여러 작업이 동시에 처리됩니다. 각각의 작업이 별도의 쓰레드에서 병렬로 실행됩니다.
  • 효율성:
    • 싱글 쓰레드: 여러 작업을 동시에 처리할 수 없어서 비효율적일 수 있습니다.
    • 멀티 쓰레드: 여러 작업을 동시에 처리하여 성능을 향상시킬 수 있습니다.
  • 구현 난이도:
    • 싱글 쓰레드: 구현이 간단하고 직관적입니다.
    • 멀티 쓰레드: 동기화 문제와 쓰레드 관리를 고려해야 해서 구현이 더 복잡할 수 있습니다.