[Beyond SW] JAVA Chap18. 스레드

이경민·2025년 11월 6일

한화시스템 Beyond SW

목록 보기
26/40

프로세스

컴퓨터에서 실행 중인 프로그램.
각 프로세스는 운영체제(OS)에서 제공하는 자원(메모리, CPU 자원 등)을 할당받으며, 이들 자원을 이용하여 실행된다.
프로세스는 독립적이고, 각각의 프로세스는 다른 프로세스와 완전히 분리되어 있다.
따라서, 각각의 프로세스는 다른 프로세스에 영향을 미치지 않고 실행될 수 있다.

스레드

프로세스 내에서 실행되는 실행 흐름의 단위.
하나의 프로세스에는 여러 개의 스레드가 있을 수 있으며, 각 스레드는 프로세스 내에서 공유하는 자원을 이용하여 실행된다.
스레드는 프로세스 내에서 생성되며, 프로세스의 자원을 공유하기 때문에, 스레드 간의 통신 비용이 낮고, 생성 및 종료 시간이 빠르다. 따라서, 스레드를 이용하여 다중 작업을 수행하는 것이 일반적이다.

멀티 프로세스 VS 멀티 스레드

  • 멀티 프로세스 : 각각의 프로세스를 독립적으로 실행
  • 멀티 스레드 : 하나의 프로세스 내에서 여러 스레드가 동시에 작업을 수행

  • 멀티 스레드의 장점
    • 자원을 보다 효율적으로 사용 가능
    • 애플리케이션의 응답성 향상
  • 멀티 스레드의 단점
    • 동기화(Synchronization)에 주의
    • 교착상태(dead-lock)가 발생하지 않도록 주의

메인 스레드

모든 자바 프로그램은 메인 스레드가 main() 메소드를 실행하며 시작한다.
main() 메소드의 첫 코드부터 아래로 순차적으로 실행되고, return을 만나면 종료된다.
작업 스레드들을 만들어서 병렬 코드를 실행할 수 있다. (멀티 스레드를 이용한 멀티 태스킹)

프로세스 종료

싱글 스레드의 경우 메인 스레드가 종료되면 프로세스도 종료 되지만 멀티 스레드의 경우 실행중인 스레드가 하나라도 있다면 프로세스가 종료되지 않는다.

데몬 스레드

다른 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드.
데몬 스레드 이외의 스레드들이 모두 종료되면 데몬 스레드는 강제적으로 종료된다.
ex) 가비지 컬렉션, 워드 프로세서의 자동저장, 화면 자동갱신 등

run()

start()

스레드 스케쥴링

스레드개수가 코어수보다 많을 때 스레드를 어떤 순서로 동시성을 실행할 것인가를 결정하는 것.
스케쥴링에 의해 스레드들은 번갈아 가며 run() 메소드를 조금씩 실행한다.

우선 순위 방식(Priority)

우선 순위가 높은 스레드가 작업 시간을 더 많이 가지도록 하는 스케쥴링 방식이다. 스레드에 1~10까지 우선 순위 번호 부여 가능하다. 번호가 높을수록 우선 순위가 높다. 스레드 생성시 우선 순위 기본값은 5이다.

public class Run {
	public static void main(String[] args) {
		클래스명 레퍼런스 = new 생성자(); //Thread를 상속한 객체 생성
		레퍼런스.setPriority(1 ~ 10);
	}
}

순환 할당 방식(Round-Robin)

시간 할당량(Time Slice)를 정하여 하나의 스레드를 정해진 시간만큼 실행시키는 스케쥴링 방식
JVM에 의해 정해지므로 코드로 제어 불가능하다.

스레드 컨트롤

실행중인 스레드의 상태를 제어하는 것.
효율적이고 정교한 스케쥴링을 위한 스레드 상태를 제어하는 기능이 제공된다.
sleep(long millis) 현재 스레드를 주어진 시간만큼 일시 중단한다.
join() 다른 스레드가 작업을 완료할 때까지 현재 스레드를 일시 중단한다.
interrupt() 스레드가 일시 중단되어 있는 경우, 스레드를 중단시킨다.
yield() 다른 스레드에게 실행 기회를 넘겨주고, 현재 스레드를 일시 중단시킨다.
wait() 동기화된 블록 안에서 다른 스레드가 이 객체의 notify(), notifyAll()을 호출하거나 지정된 시간이 지날 때 까지 현재의 스레드를 대기시킨다.
notify() 동기화된 블록 안에서 호출한 객체 내부에 대기중인 스레드를 깨운다. 여러 스레드가 있을 경우 임의의 스레드 하나에만 통보한다.
notifyAll() 동기화된 블록 안에서 호출한 객체 내부에 대기중인 모든 스레드를 깨운다. 하지만 lock은 하나의 스레드만 얻을 수 있다.

동기화(Synchronized)

한번에 한 개의 스레드만 프로세스 공유 자원(인스턴스)에 접근할 수 있도록 락(Lock)을 걸어 다른 스레드가 진행중인 작업에 간섭하지 못하도록 하는 것

0개의 댓글