🏫 Open API_JAVA

[44일차] 멀티 스레드 개념 / 작업 스레드 생성과 실행 / 스레드 우선순위

Dorothy_YANG 2022. 9. 26. 10:30
728x90

20220923(금)

  • 목차
    - 멀티 스레드 개념
    - 작업 스레드 생성과 실행
    - 스레드 우선순위

< 멀티 스레드 개념 >

1) 프로세스와 스레드

  • 프로세스(process)
    실행 중인 하나의 프로그램으로 기본적으로 한 개의 스레드(= 메인 스레드)를 하나씩 갖고 있다.
    하나의 프로그램이 다중 프로세스를 만들기도 함
    (운영체제로부터 메모리를 할당받아 사용중인 프로그램)

  • 하나의 프로그램이 다중 프로세스 만들기도
    ex) 그림판 ➡ 실행 할 때마다 프로세스가 여러개 만들어진다.

그림판 3개 켜놓으면 프로세스가 3개 실행된다.

 

      ✔ 프로세스 개념 쉽게 이해하기

      - 책꽂이 : 하드디스크 (HDD, SDD) ➡ 커야지 많은 책(데이타와 프로그램) 보관 가능
      - 책 : 데이타, 프로그램(S/W)
      - 책상 : 메모리(램)
      - 책상에서 책을 펼친다 : 메모리를 할당 받았다. ➡ 펼쳐진 상태를 프로세스라 한다.

 

  • 멀티 태스킹(multi tasking)
    두 가지 이상의 작업을 동시에 처리하는 것
    ex) 음악을 들으면서 작업하는 것
멀티 프로세스 멀티 스레드 (프로세스 안의 개념)
독립적으로 프로그램들을 실행하고 여러 가지 작엄 처리 한 개의 프로그램을 실행하고 내부적으로 여러 가지 작업 처리

 

     ✨ 스레드?
     모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행한다.
     또한, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 합니다.

     ex) 게임 자체가 엄청난 스레드로 만들어진다. 🤯🤯
           게임 캐릭터를 만들면 한명 움직일 때 다른애 못움직임.
            ➡ 여러개의 스레드를 만들어놔야지 볼 수 있음.

 


2) 메인 스레드 - main() 메소드의 상위개념

  • 모든 자바 프로그램은 메인 스레드가 main() 메소드 실행하여 시작
  • main() 메소드의 첫 코드부터 아래로 순차적으로 실행
  • main 스레드는 작업 스레드들을 만들어 병렬로 코드들 실행 (같은 레벨)

 

      실행 중인 하나의 프로그램으로 기본적으로 한 개의 스레드(= 메인 스레드)를 하나씩 갖고 있다.

      Hello.java & java Hello.java ➡ Hello.class(바이트코드) ➡ java Hello
      - JVM : Hello.class ➡ 기계어 변환 후 실행
      - JVM : main 스레드 호출 ➡ main()메소드 동작

      * 메서드를 만들고 스레드로 붙여넣으면 각 코드들을 동시진행하게 만들 수 있다.

 


< 작업 스레드 생성과 실행 >

  • CPU : 스레드 단위로 작업을 진행한다.
✨ Thread 클래스로부터 직접 생성 Thread 하위 클래스로부터 생성
class Test implements Runnalbe { } class Test extends Thread { }
얘가 더 많이 사용된다.

 왜? ➡ thread 클래스 상속은 하나만 받을 수 있는데
runnable 이용하면 다른 것도 받을 수 있기 때문!

ex) class Test extends 클래스 implements Runnalbe { }
-

 

  • 프로세스와 스레드 차이

프로세스와 스레드 차이 살펴보기

 

  • 스레드의 이름
    - 메인 스레드 이름: main
    - 작업 스레드 이름 (자동 설정) : thread.getName();
    - 작업 스레드 이름 변경 : thread.setName("스레드 이름");
    - 코드 실행하는 현재 스레드 객체의 참조 얻기 : Thread thread = Thread.currentThread();

< 스레드 우선순위 >

  • 멀티 스레드 작업은 병렬적으로 실행되는 것처럼 보이지만, 
    사실은 번갈아가며 실행하는 동시성 작업이다.
    번갈아 실행하는 것이 워낙 빠르다보니 병렬성으로 보일 뿐이다.

 

  • 스레드 스케줄링
     : CPU가 스레드를 번갈아주며 실행시키는 것
       스레드의 개수 > 코어의 수 ➡ 스레드를 어떤 순서로 동시성으로 실행할 것인가 결정
       (스레드 : 내가 부릴 노예의 손 개수 / 코어 : 내가 부릴 노예의 수)
     : 스케줄링에 의해 스레드들은 번갈아 가며 run() 메소드를 조금씩 실행 ➡ 결과치를 뽑아냄

  • 개발시)
    내가 원하는 방향으로 제대로 구성되어있는지 테스트 많이 실행한다. ➡ 일정한 패턴으로 나오는지 확인

  • 자바의 스레드 스케줄링 (2가지 방식을 함께 실행)
우선 순위(Priority) 방식 순환 할당(Round-Robin) 방식
코드로 제어 가능
우선 순위가 높은 스레드가 실행 상태를 더 많이 가지도록 함
1 ~ 10까지 값을 가질 수 있으며 기본은 5

BUT, 절대적인 우선 순위는 아니다.
➡ cpu는 얘 하나만 바라보고 있는게 아니야!
➡ 
* 코드로 제어할 수 없음 (조금의 인위적인 제어는 가능)

시간 할당량 정해서 하나의 스레드를 정해진 시간만큼 실행

 

  • 스레드 10개를 생성하고 20억 번의 루핑을 누가 더 빨리 끝내는가를 테스트한 예제.
    Thread 1 ~ 9는 우선순위를 가장 낮게 주었고,  Thread 10은 우선순위를 가장 높게 주었다.
    ➡ 결과는 Thread 10의 계산 작업이 가장 빨리 끝난다.

728x90