JAVA

자바(Java) - 스레드(Thread)

PGNV 2022. 1. 20. 14:47

 

 

 

 

 

 

 

Process

  • 실행 중인 하나의 프로그램
  • 하나 이상의 Thread로 구성됨

 

Thread (실이라는 단어로 표현)

  • Process의 실행 단위
  • CPU, Code, Data로 구성 됨
  • CPU의 효율성 증가
  • Thread의 생성이 Process의 생성보다 빠름
  • Process와 같은 메모리 공간을 사용하므로 메모리 점유 공간이 작음
  • 통제가 쉽고 기존 정보와의 공유가 쉬움

 

 

 

 

Thread의 Life Cycle

New

  • Thread 객체 생성

 

Runnabe

  • 새로 생성된 스레드가 시작된 후 스레드가 실행 가능하게 됨
  • 이 상태의 스레드는 작업을 실행 중인 것으로 간주

 

Terminated 

  • Runnable상태의 Thread는 작업을 완료하거나 다른 방식으로 종료될 때 Terminated 상태로 전환

 

 

Thread 구현 1

1. java.lang.Thread 클래스를 상속받은 클래스를 하나 선언

2. java.lang.Thread 클래스의 run() 메서드 Overriding 하여 재정의

3. 1번에서 선언한 클래스의 객체를 main()메서드에 생성

4. 3번에서 생성한 객체의 start() 메서드 호출

 

 

Thread 구현 2

1. 다른 클래스를 상속받고 있어 java.lang.Thread클래스를 상속받지 못하는 경우인지 확인

2. 1번 확인이 됐다면, Runnable 인터페이스를 상속받은 클래스를 하나 선언

3. Runnable 인터페이스의 run() 메서드 재정의

4. 2번에서 선언한 클래스로 Runnable 객체를 main() 메서드에 생성

5. 4번에서 생성한 Runnable 객체를 가지고 java.lang.Thread클래스의 객체 생성 (생성자 argument에 주입)

6. 5번에서 생성한 java.lang.Thread 객체의 start() 메서드 호출

※절대 run() 메서드를 직접 호출하지 말 것! (Thread 스케쥴러가 run()메서드를 호출함)

 

 

 

Thread 메서드 종류

  • Thread 구현 : public void run()
  • Thread Start : public void start()

 

Thread 제어

  • public static void sleep(long millis)
  • public final void join(long millis)

 

Thread 우선순위

우선순위(priority) 방식

  • 우선순위가 높은 스레드가 실행상태를 더 많이 가져감.
  • 객체에 우선순위를 부여하여 개발자가 제어가능.
  • 1부터 10까지 우선순위, 높으면 먼저 실행
thread.setPriority(우선순위);
  • public final int getPriority() - getter
  • public final void setPriority(int newPriority) - setter

※스레드 우선 순위는 스레드가 실행되는 순서를 무조건 보장할 수 없음(Java Thread Scheduler 마음)

고려O, 무조건 보장X

 

Thread상수

  • public static final int MIN_PRIORITY
  • public static final int NORM_PRIORITY
  • public static final int MAX_PRIORITY

 

 

Sleep() 메서드 (일시정지)

  • 실행중인 스레드를 일시정지.
  • 매개값으로 밀리초를 넣어주면 해당 시간동안 sleep() 메소드를 만나는 스레드는 일시정지함

 

 

 

Join() 메서드 (대기)

  • 현재 스레드의 run() 메서드에서 다른 스레드의 join() 메서드를 호출하면 다른 스레드의 작업이 종료되거나 지정된 시간이 지날 때까지 현재 스레드가 Waiting(대기) 상태가 됨

 

 

 

yield() 메서드

  • yield() 메소드를 호출하면 호출한 스레드는 실행대기상태로 돌아가고 동일한 우선순위 혹은 높은 우선순위를 갖는 다른 스레드가 실행 기회를 갖게됨.

 

 

Waiting() 메서드

  • 다른 Thread가 작업을 수행하는 동안 대기 상태로 전환
  • 다른 Thread가 대기 중인 스레드에게 실행하라는 신호를 보낼 때문 Running상태로 다시 전환

 

wait() 메서드

  • Thread 객체가 현재 작업 할 수 없는 상활일 때 호출
  • 작업 중이던 객체는 자원을 반납하고 Waiting(대기) 상태로 됨

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

동시성(Concurrency)과 병렬성(Parallelism)

동시성(Concurrency) 병렬성(Parallelism)
동시에 실행되는 것 같이 보이는 것 실제로 동시에 여러 작업이 처리되는 것
싱글 코어에서 멀티 쓰레드(Multi thread)를 동작 시키는 방식 멀티 코어에서 멀티 쓰레드(Multi thread)를 동작시키는 방식
한번에 많은 것을 처리 한번에 많은 일을 처리
논리적인 개념 물리적인 개념

 

 

 

 

 

 

 

 

 

 

 

'JAVA' 카테고리의 다른 글

스프링 (SpringFramework)  (0) 2022.03.16
자바(Java) I/O 개념  (0) 2022.01.20
자바 컬렉션 프레임워크(Collection Framework)  (0) 2022.01.19
자바 제네릭(Generics)  (0) 2022.01.19
자바 예외 처리  (0) 2022.01.19