◇ 프로세스와 쓰레드의 개념
- 프로세스 : 운영체제로부터 자원을 할당받는 작업의 단위
- 프로세스의 구조 : Code와 Data그리고 메모리 영역(Stack, Heap)으로 구성
- Code : main메소와 같은 코드
- Data : 프로그램이 실행 중 저장 할 수 있는 저장공간
- Memory : Stack(지역변수, 매개변수, 리턴변수), Heap(동적으로 필요한 변수)를 저장
- 프로세스의 구조 : Code와 Data그리고 메모리 영역(Stack, Heap)으로 구성
- 쓰레드 : 프로세스가 할당받은 자원을 이용하는 실행의 단위
- 작업중인 프로그램에서 실행요청이 들어오면 생성
- 명령처리를 위한 메모리공간(Stack)도 할당받음
◇ 쓰레드
- 싱글 쓰레드 : 프로세스 안에서 하나의 쓰레드만 실행되는 것
- 멀티 쓰레드 : 프로세스 안에서 여러개의 쓰레드가 실행되는 것
- 멀티 쓰레드의 장점
- 동시 작업으로 성능이 좋아진다.
- 스택을 제외한 모든 영역에서 메모리를 공유하기 때문에 자원을 효율적으로 사용할 수 있다.
- 응답 쓰레드와 작업 쓰레드를 분리하여 빠르게 응답을 줄 수있다. (비동기)
- 멀티 스레드의 단점
- 프로세스의 자원을 공유하면서 작업을 처리하기 때문에 충돌이 발생할 수 있다.
- 교착상태가 발생할 수 있다(A가 B를 B가 A를 원하는 상황)
- 멀티 쓰레드의 장점
- Thread : Thread를 extends(상속)받아 구현
public class Main { public static void main(String[] args) { TestThread thread = new TestThread(); thread.start(); } } class TestThread extends Thread { @Override public void run() { for (int i = 0; i <100; i++) { System.out.print("*"); } } }
- Runnable : Runnable을 implements해 구현
public class Main { public static void main(String[] args) { Runnable run = new TestRunnable(); Thread thread = new Thread(run); thread.start(); } } class TestRunnable implements Runnable { @Override public void run() { for (int i = 0; i <100; i++) { System.out.print("$"); } } }
※ Runnable 방법을 선호하는 이유 : 인터페이스이기에 클래스를 상속받을 수 있다. - 데몬 쓰레드 : 보이지 않는 곳(background)에서 실행되는 낮은 우선순위를 가진 쓰레드
demon쓰레드는 우선순위가 낮다, 다른 쓰레드가 모두 종료되면 강제 종료당하기 때문에public class Main { public static void main(String[] args) { Runnable demon = () -> { for (int i = 0; i < 1000000; i++) { System.out.println("demon"); } }; Thread thread = new Thread(demon); thread.setDaemon(true); // true로 설정시 데몬스레드로 실행됨 thread.start(); for (int i = 0; i < 100; i++) { System.out.println("task"); } } }
main이 100이 찍히면 그 즉시 종료된다. - 사용자 쓰레드 : 보이는 곳(foreground)에서 실행되는 높은 우선순위를 가진 쓰레드
기존에 만들었던 쓰레드 들이 다 사용자 쓰레드이다. - 쓰레드 우선순위와 쓰레드 그룹
- 최대 우선순위(MAX_PRIORITY) = 10
- 최소 우선순위(MIN_PRIORITY) = 1
- 보통 우선순위(NROM_PRIORITY) = 5 → 기본값
※ 더 세분하게 1~10으로 지정 가능, 해당 우선순위는 OS가아닌 JVM에서 설정한 우선순위
- 쓰레드 그룹 : 서로 관련된 쓰레들끼리 그룹으로 묶어 다룰 수 있다.
- 우선순위 설정 및 확인방법
// 설정
Thread thread1 = new Thread(task1);
thread1.setPriority(8);
// 확인
int threadPriority = thread1.getPriority();
System.out.println("threadPriority = " + threadPriority);
'Java & Spring > Java' 카테고리의 다른 글
csv파일으로 더미데이터 생성하기 (0) | 2024.11.08 |
---|---|
18일차 - Java강의(쓰레드 명령어) (0) | 2024.08.07 |
13일차 - Java강의(예외, 제네릭) (0) | 2024.07.31 |
11일차 - Java강의(계산기 실습, 클래스화, 추상화) (0) | 2024.07.29 |
10일차 - Java강의(제어자, package, import, 상속, this, super) (0) | 2024.07.26 |