프로세스와 스레드
프로세스 : 운영체제로부터 자원을 할당받는 작업의 단위
-ex)OS운영체제 내에서 크롬 브라우저를 시작 => 프로세스 1개 실행
프로세스 구조
-OS가 프로그램 실행을 위해 프로세스 할당할 때 Code와 Data, 메모리 영역(Stack, Heap)을 할당해준다.
-Code : Java main메서드 와 같은 코드들
-Data : 프로그램 실행 중 저장 할수 있는 저장공간
전역변수, 정적변수(static), 배열 등 초기화된 데이터를 저장하는 공간
-메모리 영역
ㄴStack : 지역변수, 매개변수 리턴 변수를 저장
ㄴHeap : 프로그램이 동적으로 필요한 변수를 저장
-Data와 Memory는 성격이 다르다.
스레드 : 프로세스 내에서 일하는 일꾼(코드 실행의 흐름)
-생성 : 프로세스가 작업중인 프로그램에서 실행요청이 들어오면 스레드를 생성, 명령을 처리하도록 한다.
ex)Thread thread = new Thread(task, "Thread"); // NEW
-스레드의 자원
ㄴ프로세스 내에는 여러 스레드들이 있고, 스레드들은 실행을 위해 프로세스 내 주소공간이나 메모리공간(Heap)을 공유 받는다.
ㄴ각 명령처리를 위한 자신만의 메모리 공간(Stack)도 할당받는다.
Java에서의 스레드 => 기본적으로 위와 비슷하다
-OS 위의 JVM 내에서 실행. Stack, Heap 영역들 동일
멀티 스레드 ↔ 싱글 스레드(지금까지 작업방식)
ex)System.out.println("와 머리 터지겠다~")
Java는 메인 스레드가 main() 메서드를 실행시키면서 시작
-여러개의 스레드를 만들어 동시에 내용을 처리하게 하는 것 => 멀티 스레드 지원
-메인 스레드는 필요에 따라 작업 스레드들을 생성해 병렬로 코드를 실행 시킬 수 있다.
싱글 스레드 : 프로세스 안에서 하나의 스레드만 실행
-JVM의 메인 스레드가 종료되면 JVM도 같이 종료.
멀티 스레드 : 프로세스 내에서 여러개의 스레드가 실행
ㄴ장점
-여러 작업을 동시에! => 성능 증가
-스택 제외 모든 영역에서 메모리르 공유 => 자원을 효율적으로 사용 가능
ㄴ단점
-동기화 문제(충돌) 발생,
-교착상태(Dead-Lock)발생 : 둘 이상의 스레드가 서로의 자원을 필요로 할 때 서로 작업이 종료되기까지 무한히 기다리게 되는 것
멀티 스레드를 안정적으로 컨트롤 할 수 있는 기법들이 있음.
스레드 상태와 제어
-sleep()
-interrupt()
스레드 객체생성 NEW -start()-> 실행대기 RUNNABLE <-반복-> 실행 -> 종료
-실행과 대기를 반복하며 run() 메서드를 수행.
-run 메서드가 종료되면 실행이 멈춤
실행대기RUNNABLE -> 실행 -> 일시정지 -> 실행대기RUNNABLE => 반복
스레드의 상태들
상태 | Enum(상수) | 설명
객체생성 | NEW | 쓰레드 객체 생성, 아직 start() 메서드 호출 전의 상태
실행대기 | RUNNABLE | 실행 상태로 언제든지 갈 수 있는 상태
일시정지 | WAITING | 다른 쓰레드가 통지(notify) 할 때까지 기다리는 상태
일시정지 | TIMED_WAITING | 주어진 시간 동안 기다리는 상태
일시정지 | BLOCKED | 사용하고자 하는 객체의 Lock이 풀릴 때까지 기다리는 상태
종료 | TERMINATED | 쓰레드의 작업이 종료된 상태
sleep(), interrupt()
-sleep : 현재 스레드를 지정된 시간동안 멈춘다. -> 자신 스레드만 가능
데몬 스레드
-보이지 않는 곳(background)에서 실행되는 낮은 우선순위의 스레드
-보조적인 역할을 담당 => 대표적으로 가비지 컬렉터(GC) -> 메모리 정리
사용자 스레드
-보이는 곳에서 (foreground)에서 실행되는 높은 우선순위를 가진 스레드들
-프로그램 기능 담당 => 메인스레드가 대표적
*JVM은 사용자 스레드의 작업이 끝나면 데몬 스레드도 자동으로 종료시킴
스레드 우선순위와 스레드 그룹***
-스레드 작업의 중요도에 따라 스레드의 우선순위를 부여 가능 => 리소스를 많이 할당함
-최대우선 (MAX_PRIORITY) = 10
-최소우선 (MIN_PRIORITY) = 1
-보통우선 (NROM_PRIORITY) = 5 => 기본 값
ㄴ JVM에서 설정한 우선순위
ㄴ 1~10사이의 숫자로 지정 가능
Priority지정 => 무거운 작업에서 빛을 발한다.
스레드 그룹
-JVM이 시작되면 system 그룹이 생성되고 스레드들은 기본적으로 system 그룹에 포함된다.
-모든 스레드들은 반드시 하나의 그룹(ex).main스레드)에 포함되어 있어야 한다.
ㄴ스레드 그룹을 지정받지 못한 스레드는 자신을 생성한 부모 스레드의 그룹과 우선순위를 상속,
우리가 생성하는 스레드들은 main스레드 하위에 포함.
=> 스레드 그룹을 지정하지 않으면 해당 스레드는 자동으로 main그룹에 포함.
(1)Thread Main.java에서 Thread를 상속받아와 실행
public class Thread "extends" Thread {
@Override
public void run() { }
}
(2)Runnable Main.java에서 Runnable 상속받아와 실행
public class Thread "implements" Runnable {
@Override
public void run() { }
}
(3)Lambda
Runnable task = () -> {
식
}
Thread thread1 = new Thread(task);
thread1.setName("thread1")
Thread1.start();
ㄴ//걸리는 시간이나, 동작을 예측할 수 없다.
ㄴ//운영체제, 성능에 따라 다르다.
계속 드가는거다...
'문법 > JAVA' 카테고리의 다른 글
Entity…나는 응답한다…! (1) | 2023.12.08 |
---|---|
가막눈 쑤준 (1) | 2023.11.16 |
저 객체가 그 객체요? ??? (0) | 2023.10.26 |
클래스와 아이들 (0) | 2023.10.23 |
상속 (0) | 2023.10.21 |