[CS] Thread

말하는 감자·2025년 1월 5일

CS

목록 보기
4/33
post-thumbnail

쓰레드란

쓰레드는 프로그램의 실행 흐름을 나타내는 가장 작은 단위로, 쓰레드는 프로세스 내에서 실행될 수 있는 여러개의 작업(코드 실행) 중 하나로, 각 쓰레드는 독립적으로 처리되지만 같은 프로세스 내에 있는 여러 쓰레드가 자원을 공유할 수 있다.

  • 프로세스
    : 운영체제에서 실행되는 프로그램을 지칭하며, 프로세스는 자신의 메모리 공간을 가지고 독립적으로 실행된다.
  • 쓰레드
    : 프로세스 내에서 실행되는 작업의 단위로, 메모리와 자원을 공유하며 다른 쓰레드와는 독립적으로 실행된다.

쓰레드의 생성

java에서는 Thread 클래스를 상속받거나, Runnable 인터페이스를 구현하여 생성 가능하다.

class MyThread extends Thread {
    public void run() {
        System.out.println("Thread is running");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();  // 쓰레드를 실행
    }
}

쓰레드의 상태

1. New(생성)

  • 쓰레드가 생성되었지만 아직 실행되지 않은 상태
  • 이 상태에서는 쓰레드 객체가 생성 되었으나 start() 메서드가 호출되어 실행되지 않은 상태

2. WAITING (대기 상태)

  • 다른 쓰레드가 특정 작업을 수행하기 기다리는 상태
  • wait(), join() 과 같은 메서드를 호출함으로써 이 상태가 된다
    • join(): 특정 스레드가 종료될 때까지 현재 쓰레드를 대기 상태로 만드는 메서드.
		try {
        		    threadB.join();  
        		} catch (InterruptedException e) {
            		e.printStackTrace();
        		}
		- main메서드에서 스레드 B를 호출하여 join하여
        스레드 B가 종료될때 까지 메인 스레드를 대기 상태로 만듬
  • wait(): 현재 쓰레드를 대기상태로 만들기 위해 사용. 즉, 특정 조건(notify)이 충족될 때까지 쓰레드를 일시 정지. 반드시 동기화(synchronized)된 코드 블록 내에서 호출해야 한다.
    	synchronized (sharedObject) {
        	while (conditionNotMet) {
            	sharedObject.wait(); // 현재 쓰레드를 대기 상태로 변환
        	}
    	}

		synchronized (sharedObject) {
    		conditionNotMet = false; // 조건을 충족하는 예시
    		sharedObject.notify(); // 대기 중인 스레드 중 
            //하나를 깨움
		}
   - 이 상태의 쓰레드는 자신을 대기시키는 쓰레드가 특정 조건을 만족할
   때 까지 실행을 멈추고 대기한다.
   - 조건이 충족되면 notify()로 알려서 깨움

3. RUNNABLE (준비)

  • start() 메서드가 호출되어 쓰레드가 실행될 준비가 되었지만, CPU에서 직접 실행중이 아닐 수 있다.

4. BLOCKED (대기 상태)

  • 어떤 자원을 기다리고 있는 상태
  • 서로 다른 쓰레드가 같은 자원에 대해 잠금을 걸고 있을때, 자원을 확보하지 못한 쓰레드가 이 상태로 전환된다.

5. TERMINATED (종료 상태)

  • 실행이 끝난 상태.

멀티스레드

멀티 스레드는 하나의 프로그램을 여러 실행 단위로 쪼개 실행한다는 측면에서 다중 처리와 의미가 비슷하지만, 동일 프로세스의 스레드들은 서로 자원을 공유하며 자원 생성과 관리의 중복성을 최소화 한다는 점에서 차이가 있다.
또한 각 스레드는 커널의 개입 없이 독립적으로 실행할 수있어 서버에서 많은 요청을 효과적으로 처리 가능

데몬스레드

데몬 스레드는 일반 스레드와 달리, 주로 백그라운드에서 실행되는 스레드이다
프로그램의 주요 작업을 지원하지만, 주 작업 스레드가 종료되면 함께 종료된다.

Thread daemonThread = new Thread(() -> {
    // 스레드 작업
});
daemonThread.setDaemon(true); // 데몬 스레드로 설정
daemonThread.start();

특징

  • 자동 종료
    : 모든 일반 스레드가 종료되면 데몬스레드도 자동으로 종료된다.
  • 우선순위 낮음
    : 주 작업이 완료된 후에도 계속 실행할 필요가 없는 작업들로 구성
  • 대기시간 최소화
    : 데몬스레드는 자신의 작업을 비동기적으로 수행하며, 필요한 경우 작업을 위한 대기 시간과 CPU 사용을 최소화 하도록 설계

사용 예

  • 가비지 컬렉터: 자바의 가비지컬렉터는 데몬 스레드로 실행되어 사용자가 정의한 작업과는 별도로 메모리 관리를 수행
profile
주니어개발자(?)

0개의 댓글