프로세스와 쓰레드
프로세스 : 운영체제로부터 자원을 할당받는 작업의 단위
쓰레드 : 프로세스가 할당받은 자원을 이용하는 실행의 단위

- Code는 Java main 메서드와 같은 코드를 말합니다.
- Data는 프로그램이 실행 중 저장 할 수 있는 저장공간을 의미합니다.
- Memory

쓰레드
쓰레드는 프로세스 내에서 일하는 일꾼, 코드 실행의 흐름이라고 생각하면 된다.
쓰레드 생성
프로세스가 작업중인 프로그램에서 실행요청이 들어오는 순간 쓰레드를 만들어 명령을 처리하도록 한다.
쓰레드의 자원
프로세스 안에는 여러 쓰레드들이 있고, 쓰레드들은 실행을 위한 프로세스 내 주소공간이나 메모리공간(Heap)을 공유받는다.
추가로, 쓰레드들은 각각 명령처리를 위한 자신만의 메모리공간(Stack)도 할당받는다.

Java프로그램을 실행하면 JVM 프로세스 위해서 쓰레드가 실행된다.
Java프로그램은 실행 시 Main쓰레드부터 실행된다. 이는 JVM에 의해 실행된다.
멀티 쓰레드
프로세스 안에서 여러 개의 쓰레드가 병렬적으로 실행되는 것을 말한다.
자바프로그램은 메인 쓰레드외에 다른 작업 쓰레드들을 생성하여 여러 개의 실행흐름을 만들 수 있다.
장점
- 여러 개의 쓰레드를 통해 여러 개의 작업을 동시에 할 수 있어서 성능이 좋아진다.
- 스택을 제외한 모든 영역에서 메모리를 공유하기 때문에 자원을 보다 효율적으로 사용할 수 있다.
- 응답 쓰레드와 작업 쓰레드를 분리하여 빠르게 응답을 줄 수 있다(비동기)
단점
- 동기화 문제가 발생할 수 있다.
- 교착상태(데드락)이 발생할 수 있다.
직접 코드를 짜보면서 해보자.
Thread 클래스를 상속받아 사용하는 방법

run 메서드를 오버라이딩하여 실행할 로직을 작성한다.

실행할 때에는 쓰레드를 생성하고 start메서드를 쓴다
Runnable 인터페이스를 이용한 방법 (더 자주 쓰인다)
Thread를 상속받은 것과 마찬가지로 run메서드를 오버라이딩 하여 사용한다.
실행할 때에는 Runnable 객체를 생성하여 Thread객체의 생성자안에 넣고 사용한다.

람다식을 이용해서 바로 run을 정의하여 사용할 수 있다.

실행 중 결과

위 이미지를 보면 순서없이 값이 출력되는 것을 볼 수 있는데.
이는 쓰레드 2개가 병렬적으로 작동하기 때문이다.
여기서 나오는 문제점은,, 걸리는 시간이나, 동작을 예측할 수가 없다는 것
그래서 나중에 설명하는 비동기 처리를 해주어야 한다.
Daemon thread
보이지 않는 곳(background)에서 실행되는 낮은 우선순위를 가진 쓰레드를 말한다.
보조적인 역할을 담당하며 대표적인 데믄 쓰레드로는 메모리영역을 정리해주는 가비지 컬렉터가 있다.
데몬쓰레드를 사용하기
setDaemon에 true값을 주게되면 데몬쓰레드로써 실행이 된다.
데몬의 특징
- 우선순위가 낮다 = 상대적으로 다른 Thread에 비해 resource를 적게 할당받는다.
- 좀 느리게 실행된다.
- 다른 쓰레드가 끝날 때 같이 끝나버린다.
사용자 쓰레드
보이는곳(foreground)에서 실행되는 높은 우선순위를 가진 쓰레드를 말한다.
Vmfhrmfoar l능을 담당하며 대표적인 사용자 쓰레드는 메인 쓰레드가 있다.
사용자 쓰레드 만드는법 : 기존의 만들었던 쓰레드들이 다 사용자 쓰레드이다.
쓰레드 우선순위와 쓰레드 그룹
쓰레드 우선순위
쓰레드의 작업의 중요도에 따라서 쓰레드의 우선순위를 부여할 수 있따.
작업의 중요도가 클 수록 우선순위를 높게 지정하여 더 많은 작업시간을 부여받게 한다.
- 최대 우선순위 (MAX_PRIORITY) = 10
- 최소 우선순위 (MIN_PRIORITY) = 1
- 보통 우선순위 (NROM_PRIORITY) = 5
1~10사이의 숫자로 지정이 가능하다.
- 이 우선순위의 범위는 OS가 아닌 JVM에서 설정한 우선순위이다.
- 우선순위가 높다고 먼저 실행될 가능성이 높은 거지 보장되는 것은 아니다.
.
쓰레드 그룹
예를들어 메인쓰레드 안에 100갸의 하위 쓰레드가 있다고 가정하면 하나하나 관리하기 어렵다.
따라서 특징마다 묶어 그룹으로 관리하면 한꺼번에 제어할 수 있다.
모든 쓰레드들은 반드시 하나의 그룹에 포함되어 있어야 한다.
쓰레드 그룹을 지정하지 않으면 해당 쓰레드는 자동으로 main그룹에 포함이 된다.
그룹에 담아보자

Thread1과 thread2가 모두 group1에 종속되어있다 이로써 group별로 제어를 할 수가 있다.