스레드

한상우·2023년 5월 31일
0

java

목록 보기
11/16

cpu 자원을 사용하여 코드를 실행하는 하나의 단위

메인 스레드


모든 자바 애플리케이션은 메인 스레드가 main() 메소드를 실행하면서 시작되고, main 메소드에서 마지막 코드를 실행하거나 return 을 하게 되면 종료된다.

필요에 따라 작업 스레드를 만들어 병렬로 코드를 실행할 수 있다.

싱글 스레드 애플리케이션에서는 메인 스레드가 종료되면 프로세스도 바로 종료되지만, 멀티 스레드 애플리케이션에서는 실행중인 스레드가 하나라도 있으면 메인 스레드가 종료되어도 프로세스가 종료되지 않는다.

작업 스레드의 생성과 실행


자바에서는 작업 스레드가 객체로 생성되므로 클래스가 필요함. 스레드 클래스를 직접 객체화 하거나, 스레드를 상속한 클래스를 생성 하는 방법이 있다.

직접 생성

Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {

            }
        });

Thread thread = new Thread(() -> ... )

// 람다식으로도 가능

작업 스레드는 생성되자마자 바로 실행되는 것이 아니고, start() 메소드를 호출해 매개변수로 받는 Runnable의 run 메소드를 호출해 작업을 처리한다.

하위클래스에서 생성

public class Test extends Thread{
    @Override
    public void run() {
        
    }
}

스레드 우선순위


동시성(병행성)

  • 멀티 작업을 위해 하나의 코어에서 멀티 스레드가 번갈아가며 작업을 수행
  • 동시에 스레드가 실행되는 것은 아니지만 CPU 가 빠른 속도로 CPU 제어권을 스레드에게 줬다 뺏었다 함

병렬성

  • 멀티 작업을 위해 멀티 코어에서 개별 스레드를 할당 받아 동시에 수행
  • CPU 각자가 각자의 일을 수행

스레드 스케줄링

스레드의 수가 코어의 수보다 많을 경우 어떤 스레드에게 CPU 제어권을 줘야 하는지 결정해야 함. 이를 스레드 스케줄링이라 한다. 스레드 스케줄링에 의해 스레드들은 번갈아가며 자신의 run 메소드를 실행함

특정 스레드에게 우선순위를 코드로 제어할 수도 있지만, JVM이 정해주기도 함 (RR 방식이 JVM이 정하는 방식)

동기화 메소드와 동기화 블록


임계영역

멀티 스레드 프로그램에서 하나의 스레드만 실행할 수 있는 코드 영역을 의미

자바는 임계영역을 위해 동기화 메소드와 동기화 블록을 제공, 스레드가 객체 내부의 동기화 메소드나 블록에 들어가 경우, 객체에 lock 을 걸어 다른 스레드가 임계 영역 코드를 사용하지 못하도록 함

public synchronized void syncMethod() {
	// 임계 영역
}

public void method() {

	synchronized(공유 객체) {
		// 임계 영역
	}
}

자세한 내용은 synchronized 에 정리함

스레드 상태


객체 생성

  • 스레드 객체가 생성, start 메소드 호출 전

실행 대기

  • 실행 상태로 언제든 갈 수 있는 상태

일시 정지

  • WAITING
    • 다른 스레드가 통지할 때까지 기다리는 상태
  • TIMED_WAITING
    • 주어진 시간 동안 기다리는 상태
  • BLOCKED
    • 사용하고자 하는 객체의 lock이 풀릴 때까지 기다리는 상태

종료

  • 실행을 마침

start() 호출을 통해 새로운 쓰레드가 작업을 실행

모든 쓰레드는 자신만의 호출 스택을 필요

호출 스택에서는 맨 위 메서드가 현재 실행중 메서드이고 나머지가 대기 상태.

but, 쓰레드 여러개면 스케줄러가 우선순위에 따라 실행 순서와 실행 시간을 결정, 각 쓰레드들은 자신 순서가 되면 지정된 시간동안 작업 수행

주어진 시간동안 작업 못끝내면 다시 대기 상태

다 끝내면 호출 스택 비워지고 사라짐

스레드 상태 제어 메소드


sleep

  • 주어진 시간동안 일시정지

yield

  • 이 메소드를 호출한 스레드는 실행대기 상태로 가고 우선순위 높은 다른 스레드가 실행

join

  • A 스레드가 B 스레드가 종료된 후 작업을 수행해야 할 때 사용
  • 스레드의 종료를 기다림

interrupt

  • 스레드가 일시 정지 상태에 있을 때 InterruptedException 예외를 발생시키는 역할 아래와 같이 인터럽트가 발생되면 종료 시킬 수 있다. (실행중이거나 실행 대기일 때 interrupt 메소드 실행해도 스레드가 종료되지 않고 일시정지 되어야 종료된다)
    while (true) {
                System.out.println("실행 중");
                if (Thread.interrupted()) {
                    break;
                }
            }

데몬스레드


주 스레드를 돕는 보조 스레드, 스레드가 종료되면 데몬 스레드도 같이 종료

스레드를 데몬 스레드를 만들어 주려면 thread 내부의 setDaemon(true)를 해주면 된다

  • 문서 자동 저장에 쓰임

기타


OS는 컴퓨터 자원을 관리해줌

OS에서는 스레드 단위로 스케줄링을 하여 스레드에 CPU를 할당

  • OS 가 스레드 누구에게 CPU 제어권을 줄지 결정

OS가 프로세스 1에게 1초를 주면, 그 프로세스 안에 있는 스래드 개수만큼 1초를 스케줄링 해줘, OS는 결국 스레드로 스케줄링을 해주는데, OS는 CPU 코어의 개수에 대해 몰라, 그냥 하나라고 생각함

OS가 작업량을 넘겨주면 CPU는 그냥 연산을 처리!!!

그래서 CPU의 작업 단위가 스레드라고 한다네..

프로그램은 보조기억장치 (HDD, SDD) 에 올라가있고, 이 프로그램이 메모리에 올라가게 되면 이를 프로세스라고 한다.

초기에 fork() 방식을 이용해서 자식 프로세스를 만들면서 다중 작업을 처리했는데, OS의 자원은 한정되어있지만, 늘어나는 프로세스로 인해 전체적인 속도는 계속 감소

이때 CPU가 프로세스 내에 또 작업의 흐름을 나누는 스레드를 통해 작업을 여러개 처리

프로세스: 메모리 상에 올라간 프로그램 (실행되는 프로그램)

기본적으로 프로세스는 1개의 메인 스레드를 가지고 있음

쓰레드: 프로세스 내에서 하나의 실행 흐름

멀티 쓰레드 프로세스 : 둘 이상의 쓰레드를 가진 프로세스

멀티 테스킹: 동시에 여러 작업 (OS 가 여러 프로세스 실행)

CPU 코어는 한번에 하나의 작업만 수행 가능, 코어가 짧은 시간동안 여러 작업 번갈아 수행

멀티 쓰레딩

  • CPU 사용률 향상
  • 자원 효율적 사용
  • 응답성 향상
profile
안녕하세요 ^^

0개의 댓글