본문 바로가기
Java

Jave - Thread 개괄

by sinabeuro 2022. 5. 3.
728x90

​안녕하세요.

Thread 와 Thread 동시성 문제에 관해서 시리즈화해서 포스트하려고 합니다.

이번 포스트에서는 Thread가 무엇이고 동시성 문제가 왜 발생하는지 알아보겠습니다.

 

Thread 란?

Thread는 프로세스 내에서 실행 되는 실행의 단위입니다.

스프링에서 실행되는 public static void main(String[] args) { } 메소드도 사실 유저 스레드의 중에 하나입니다.

알게 모르게 유저 스레드를 만들어서 실행하고 있는 셈이죠.

 

일반적으로 우리는 멀티 코어에서 멀티 스레드를 사용하게 될 것입니다.

멀티 코어는 CPU의 코어를 말하는 것이고 여러 작업장이 존재하는 것으로 비유할 수 있습니다.

멀티 스레드는 작업장 하나에서 번갈아가면서 스레드를 수행하는 것입니다.

또한 멀티 스레드는 하나의 프로세스 내에서 자원을 공유합니다.

다시 말하면, 스레드 내의 독자적인 Stack 을 제외한 모든 자원을 공유합니다.

 

이러한 멀티 스레드의 자원 공유로 다음과 같은 장단점을 가집니다.

 

멀티 스레드의 장점

- CPU의 사용률을 향상시킨다.

- 자원을 보다 효율적으로 사용할 수 있다.

 

멀티 스레드의 단점

- 프로세스 자원 공유로 인한 동기화(synchronization), 교착상태(deadlock) 문제가 발생할 수 있다.

 

 

스레드 스케줄링(Scheduling)

운영체제가 프로세스 또는 스레드에 CPU를 할당하는 것을 스케줄링이라고 합니다.

스케줄러의 정책에 의해 프로세스에 효율적으로 CPU(자원)을 할당합니다.

 

스레드를 만들고 start() 를 호출하면 바로 실행되는 것이 아니라 실행대기열에 저장되어 자신의 차례가 될 때까지 기다려야 합니다. 

실행대기열은 큐(queue) 와 같은 구조로 먼저 실행대기열에 들어온 쓰레드가 먼저 실행됩니다. (선입선출 구조)

 

스레드는 suspend(), sleep(), wait(), join(), I/O block 에 의해 일시정지 상태가 될 수 있다.

지정된 일시정지시간이 다되거나(time-out), notify(), resume(), interrupt() 가 호출되면 일시정지상태를 벗어나 다시 실행대기열에 저장되어 자신의 차례를 기다리며 대기 상태가 됩니다.

실행을 모두 마치거나 stop() 이 호출되면 쓰레드는 소멸됩니다.

 

스레드의 실행제어 메소드

http://selab.gnu.ac.kr/oop/basics/Ch_11.pdf 일부발췌

 

 

스레드의 스케줄링에 영향을 줄 수 있는 것이 스레드 그룹스레드 우선순위입니다.

 

스레드 그룹

스레드 그룹을 생성해서 스레드를 그룹으로 묶어서 관리할 수 있습니다.

또한 스레드 그룹에 다른 스레드 그룹을 포함할 수 있습니다.

 

ThreadGroup myGroup = new ThreadGroup("myGroup");
Thread thread1 = new Thread(myGroup, new ExampleThread(bankBook), "thread1");
Thread thread2 = new Thread(myGroup, new ExampleThread(bankBook), "thread2");

 

스레드 그룹은 간략하게 다루고 넘어가겠습니다.

자세한 점은 다른 블로그의 글을 참조하시면 좋을 것 같습니다.

 

 

스레드 우선순위

스레드에 setPriority 메소드를 사용하여 스레드 우선 순위를 지정할 수 있습니다.

스레드 우선순위란 프로세스 우선순위에 따라 우선적으로 자원을 할당하여, 해당 스레드가 좀 더 빠르게 작업 완료 될 수 있도록 합니다. 

기본적으로 스레드 우선순위는 5로 설정되어있으며, 1~10 까지 변경할 수 있습니다.

    public void test() {
        Thread thread1 = new Thread(new ThreadOutput1());
        Thread thread2 = new Thread(new ThreadOutput2());
        thread1.setPriority(7);
        thread1.start();
        thread2.start();
    }

싱글 코어에서는 우선순위가 유의미한 차이를 나타냅니다.

하지만 멀티 코어에서는 우선순위에 따른 차이가 전혀 없습니다.

멀티 코어에서는 자원이 고르게 분배되어 스레드들을 거의 균등하게 실행합니다.

즉, 멀티 코어에서는 스레드의 우선 순위를 지정할 필요가 없습니다.

 

다음 포스트에는 Thread 동시성에 대해서 다루어 보겠습니다.

728x90

댓글