20220923(금)
- 목차
- 멀티 스레드 개념
- 작업 스레드 생성과 실행
- 스레드 우선순위
< 멀티 스레드 개념 >
1) 프로세스와 스레드
- 프로세스(process)
실행 중인 하나의 프로그램으로 기본적으로 한 개의 스레드(= 메인 스레드)를 하나씩 갖고 있다.
하나의 프로그램이 다중 프로세스를 만들기도 함
(운영체제로부터 메모리를 할당받아 사용중인 프로그램) - 하나의 프로그램이 다중 프로세스 만들기도
ex) 그림판 ➡ 실행 할 때마다 프로세스가 여러개 만들어진다.
✔ 프로세스 개념 쉽게 이해하기
- 책꽂이 : 하드디스크 (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의 계산 작업이 가장 빨리 끝난다.