개주 훈련일지/📚 코살대 교본 학습

스레드

lshfood2 2025. 12. 7. 22:42

[ 프로세스와 스레드 ]

컴퓨터의 멀티태스킹을 위한 두 가지 도구

바로 프로세스와 스레드 이다.

 

프로세스

프로그램을 실행하는 순간

메모리에 올라가고 동작하게 되는데

이 상태의 프로그램을 '프로세스' 라고 한다.

 

스레드

프로세스는 독립적으로 메모리에 등록되므로

여러 개의 프로그램을 동시에 실행할 수 있게 된다.

이러한 프로세스 내부에 존재하면서

실행 흐름을 나타내는 것을 '스레드' 라고 한다.

 

각각의 프로세스들은 메모리에

독립적으로 등록되어 서로 간섭할 수 없다.

 

또한 하나의 프로세스 안에서 다양한 작업을

동시에 하기 위해 스레드가 각자 독립적으로

존재하여 일을 수행한다.


[ 스레드의 사용 ]

자바에서 스레드를 생성하는 방법은

다음과 같이 두 가지 방법이 있다.

- Thread 클래스를 상속하여 run() 메서드 구현

- Runnable 인터페이스 구현

 

1. Thread 클래스 상속

스레드는 run() 메서드에서 구현하지만

클래스 실행을 위해서는 start() 메서드를 호출한다.

class MyThread extends Thread {
	
    @Override
    public void run() {
    //스레드 동작을 위한 run 메서드	
        int sum = 0;
        for(int i=0; i<10; i++){
        	sum = sum+(i+1);
        }
    }
}

public class SunMain {
	
    public static void main(String[] args){
    	MyThread th = new MyThread();
        th.start();
        //start를 통한 스레드 시작
    }
}

위와 같이 스레드는 start() 메서드 호출을 통해

준비된 스레드 동작 run() 메서드가 시작된다.

 

2. Runnable 인터페이스 구현

자바는 다중 상속이 불가능하기 때문에

기존에 상속되어 있는 클래스에서 스레드를 만들 경우

Runnable 인터페이스를 상속하여 구현해야 한다.

Thread th = new Thread(Runnable을 상속한 인스턴스);

위와 같이 Thread 클래스를 선언하면서 Runnable을

상속한 클래스를 선언하여 매개변수로 넘겨줘야 한다.

 

Why?
실제 Thread 클래스가 실행하는 주체이고,

Runnable 인터페이스를 상속한 클래스는

실행 코드를 지닌 객체이기 때문이다.

class WhiteFlag imeplements Runnable {
	
    @Override
    public void run() {
    //스레드 동작을 위한 run 메서드	
        while(true){
        System.out.println("백기 올려");
        }
    }
}

public class RunnableExample {
	
    public static void main(String[] args){
    	Thread white = new Thread(new WhiteFlag());
        white.start();
        //start를 통한 스레드 시작
    }
}

 

▼ 익명 클래스를 람다식으로 표현

public class RunnableExample {
	
    public static void main(String[] args){          	
    	//상속하지 않고 람다식으로 익명객체 선언
        Runnable white= () → {
       		while(true){        	
            	System.out.println("백기 올려");
       		}
    	};
        
        Thread white = new Thread(new WhiteFlag());
        white.start();
        //start를 통한 스레드 시작
}

 

Runnable 인터페이스를 상속해 구현하지 않고

람다식을 활용해 익명 객체로 선언하여 처리하면

따로 클래스를 만들지 않아도 스레드를 구현할 수 있다.

 

스레드 이름 부여

스레드는 다중 실행이 실행이 가능하기 떄문에

어떤 스레드가 어떤 작업을 하는지 알기 위해

원하는 이름을 부여할 수 있다.

 

1) 스레드 클래스를 상속한 경우

- setName 사용하여 이름 변경

- getName 사용 시 이름 확인

 

2) Runnable 인터페이스를 상속한 경우

-Thread 선언한 후 이름 부여

Thread myThread = new Thread(task);
myThread.setName("Thread-blue");

[ 스레드 동기화 ]

여러 개의 스레드를 이용해 동시에 서로 다른

작업을 수행하는 것이 '멀티 스레드' 이다.

 

멀티 스레드가 실행될 때 하나의 데이터를

공유받은 다수의 스레드가 있다면 경쟁이 일어나며

순서가 꼬이고 비정상적인 동작이 일어날 수 있다.

 

이러한 오류를 방지하기 위해 여러 스레드가

하나의 공유 데이터에 동시에 접근하지 못하도록

스레드의 실행을 제어하는데 이를 '스레드 동기화' 라고 한다.

 

스레드 동기화 처리

멀티 스레드 프로그램에서 단 하나의 스레드만

처리할 수 있는 영역을 '임계 영역'이라고 한다.

 

하나의 스레드가 이 영역(=임계 영역)에 진입할 때

락을 걸어 다른 스레드가 수행되지 못하도록 하고

작업이 종료되면 락을 풀어 다른 스레드가 작업하도록

하는 것을 '동기화 처리' 라고 한다. 

메서드 이름 앞에 synchronized 키워드를 사용하면
해당 메서드 전체를 동기화 처리할 수 있다.

 

메서드 동기화

public synchronized void add()...

다만 메서드 전체를 동기화하기 때문에 메서드 처리 시간이

길어질 경우 성능에 영향을 미치는 단점이 있다.

 

위와 같이 메서드 전체를 동기화 하지 않고

특정 영역만 동기화 처리 할 수도 있다.

이를 '블록 동기화 처리' 라고 한다.

 

즉 '블록 동기화' 처리는 실제 실행하는 스레드의

일부분을 동기화하여 처리하는 방법이다.

 

블록 동기화

synchronized (객체명)...

소괄호 안에 명시된 객체는 동기화가 진행된다.

특정 실행 대상만 동기화 되기 때문에 결과는 같지만

좀 더 효율적으로 프로그램이 실행된다.


[ 스레드 상태 ]

스레드는 생성하고 실행, 종료되기까지 다양한 상태를 가진다.

각 상태는 스레드 클래스에 정의되어 있으며

Thread.State 타입으로 알 수 있다.

상태 상수 설명
생성 NEW 스레드 객체가 생성되었지만 아직
start() 메서드가 호출되지 않은 상태
대기 RUNNABLE 실행 대기 또는 실행 상태로
언제든지 갈 수 있는 상태
일시정지 WATING 다른 스레드가 종료될 때까지 대기하는 상태
TIMED_WATING 주어진 시간 동안 대기하는 상태
BLOCKED 락이 풀릴 때까지 대기하는 상태
종료 TERMINATED 수행을 종료한 상태

 

▼ 스레드 상태 변화 메서드

1) sleep(int mils)
- 주어진 시간 동안 스레드 정지

 

2) wait()
- 스레드를 대기 상태로 변경

 

3) notify()
- 대기 중인 스레드를 다시 동작

- wait() 과 notify()는 세트 개념이다.

'개주 훈련일지 > 📚 코살대 교본 학습' 카테고리의 다른 글

파일 입출력  (0) 2025.12.16
소프트웨어 개발 비용 예측 기법  (0) 2025.12.09
람다식  (0) 2025.12.06
컬렉션 프레임워크 (Collection Framework)  (0) 2025.12.04
자바 API 문서  (0) 2025.12.03