본문 바로가기

코린이

chapter12 스레드 본문

자바/혼공 학습단 10기

chapter12 스레드

winsome99 2023. 7. 29. 01:42
반응형

처음으로 고급편으로 들어왔다 살면서 책을 이렇게 끝까지 간 적이 없는 거 같은데ㅋㅋㅋㅋ 혼공단 덕분에 오랜만에 열심히 공부하는 거 같다.

스레드는 작년에 학교에서 운영체제시간에 배웠지만 기억이 나질 않는다...(빡대가리) 그래서 이번 장에서 열심히 공부 하겠습니다.

12_1 멀티 스레드

운영체재에서 실행 중인 하나의 애플리케이션을 프로세스라 한다.

프로세스의 내부에서 코드의 실행 흐름을 스레드라 부른다.

 

운영체제는 두 가지 이상의 작업을 동시 처리하는 것을 멀티 태스킹이라 한다.

멀티 프로세스는 자신의 메모리를 가지고 실행해 서로 독립적이지만, 멀티 스레드는 프로세스 내부에 생성되어 스레드 하나가 예외를 발생시키면 다른 스레드도 영향을 받는다.

 

스레드

하나의 스레드는 하나의 코드 실행 흐름이기 때문에 한 프로세스 내에 스레드가 2개라면 2개의 코드 실행 흐름이 생긴다.

 

메인 스레드

자바의 모든 애플리케이션은 메인 스레드가 main() 메소드를 실행하면서 시작한다.

main() 메소드의 첫 코드부터 아래로 순차적으로 실행, main() 메소드의 마지막 코드를 실행하거나 return문을 만나 종료한다.

그리고 필요에 따라 작업 스레드들을 만들어서 병렬로 코드를 실행할 수 있다. 그 말은 멜티 스레드를 생성해 멀티 태스킹을 수행한다.

 

작업 스레드 생성과 실행

자바에는 작업 스레드도 객체로 생성되어 클래스가 필요한데 java.lang.Thread 클래스를 직접 객체화해서 생성해도 되지만, Thread 클래스를 상속해 하위 클래스를 만들어 생성할 수도 있다.

 

Thread 클래스로부터 직접 생성

Thread thread = new Thread(Runnable target);

Runnable에는 run() 메소드 하나가 있는데 구현 클래스는 run()을 재정의해서 작업 스레드가 실행할 코드를 작성해야 한다.

 

class Task implements Runnable{
	public void run(){
    //스레드가 실행할 코드;
    }
}

 

Thread 하위 클래스로부터 생성

작업 스레드가 Runnable로 만들지 않고, Thread의 하위 클래스로 작업 스레드를 정의하면서 작업 내용을 포함할 수 있다.

 

public class WorkerThread extends Thread {
	@Override
    public void run() {
    //스레드가 실행할 코드;
    }
}
Thread thread = new Worker Thread();

Thread클래스 상속 후 run() 메소드를 재정의해서 스레드가 실행할 코드를 작성

 

동기화 메소드

싱글 스레드는 1개의 스레드가 객체를 독차지해서 사용하지만 멀티 스레드 프로그램에서는 스레드를 객체를 공유해 작업해야 하는 경우가 있다.

 

동기화 메소드

  • 멀티 스레드 프로그램에서 하나의 스레드만 실행할 수 있는 코드 영역을 임계 영역이라 한다.
  • 자바에서 임계 영역을 지정하기 위해 동기화 메소드를 제공한다.
  • 동기화 메소드를 만들라면 메소드 영역에 synchronized키워드를 붙이면되는데 인스턴스와 정적 메소드 어디든 가능
  • 스레드가 동기화 메소드를 실행하는 즉시 객체가 잠금이 일어나고, 스레드가 동기화 메소드를 실행 종료하면 잠금이 풀린다.

 

12_2 스레드 제어

스레드 객체를 생성하고 run() 메소드를 호출하면 바로 실행이 아니라 실행 대기 상태가 된다.

 

실행 대기 상태

  • 언제든지 실행할 준비가 되어 있는 상태를 말한다.
  • 실행 상태의 스레드는 run() 메소드를 모두 실행하기 전에 다시 실행 대기 상태로 돌아갈 수 있다
  • 실행 상태에서 run() 메소드를 내용이 모두 실행되면 스레드의 실행이 멈추고 종료 상태가 된다.

스레드 상태

실행 대기 상태에 있는 스레드 중에서 운영체제는 하나의 스레드를 선택하고 CPU(코어)가 run() 메소드를 실행하도록 하는 것을 실행 상태라고 한다.

 

실행 상태의 스레드는 run() 메소드를 모두 실행하기 전에 다시 실행 대기 상태로 돌아갈 수 있고 실행 대기 상태에 있는 다른 스레드가 선택되어 실행 상태가 된다.

스레드는 실행 대기 상태와 실행 상태를 번갈아가면서 run() 메소드를 조금씩 실행하여 run() 메소드가 종료되면, 더 이상 실행할 코드가 없어 스레드의 실행은 멈춘다. 이것을 종료 상태라도 한다.

 

스레드 상태 제어

스레드의 상태를 변경하는 것을 의미

멀티 스레드 프로그램을 만들기 위해서는 정교한 스레드 상태 제어가 필요(상태 제어가 잘못되면 프로그램은 불안정해서 먹통이 되거나 다운이 된다.)

스레드 상태 제어에는 3가지 메소드가 있다.

메소드 설명
interrupt() 일시 정지 상태의 스레드에서 InterruptedException을 발생시켜, 예외 처리 코드에서 실행 대기 상태로 가거나 종료 상태로 갈 수 있도록 한다. 
sleep(long millis) 주어진 시간 동안 스레드를 일시 정지 상태로 만든다. 주어진 시간이 지나면 자동적으로 실행 대기 상태가 된다.
stop() 스레드를 즉시 종료, 불안정한 종료를 유발하므로 사용하지 않는 것이 좋다.

 

주어진 시간 동안 일시 정지

실행 중인 스레드를 일정 시간 멈추게 하고 싶다면 Thread 클래스의 정적 메소드인 sleep()을 사용

try{
	Thread.sleep(1000);
}catch(InteruptedExcetion e){
//interrupt() 메소드가 호출되면 실행
}

 

스레드의 안전한 종료

스레드는 자신의 run() 메소드가 모두 실행되면 자동적으로 종료하지만 경우에 따라 실행 중인 스레드를 즉시 종료해야 할 때가 있을 때는 stop() 메소드를 제공하고 있다.

 

stop 플래그를 이용하는 방법

public class XXXThread extends Thread {
	private boolean stop; // stop 플래그 필드
    
    public void run() {
		while(!stop) { //stop이 true가 되면 run() 종료
        	스레드가 반복 실행하는 코드;
        }
        //스레드가 사용한 지원 정리
    }
}

데몬 스레드

주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드

주 스레드가 종료되면 데몬 스레드는 강제적으로 자동 종료되는데 이유는 주 스레드의 보조 역할을 수행하므로 주 스레드가 종료되면 데몬 스레드의 존재 의미가 사라진다.

반응형

'자바 > 혼공 학습단 10기' 카테고리의 다른 글

chapter13 컬렉션 프레임워크  (0) 2023.08.12
혼공자 4주차 미션  (0) 2023.07.30
혼공단 3주차 미션  (0) 2023.07.23
혼공자 Chapter11 API  (0) 2023.07.21
혼공자 chapter10 예외 처리  (0) 2023.07.19
Comments