Recent Posts
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- Spring Batch
- PytestPluginManager
- terminal
- PersistenceContext
- taint
- tolerated
- 티스토리챌린지
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- 달인막창
- JanusWebRTCGateway
- python
- table not found
- 깡돼후
- kotlin
- VARCHAR (1)
- 자원부족
- k8s #kubernetes #쿠버네티스
- JanusGateway
- 오블완
- preemption #
- vfr video
- pytest
- mp4fpsmod
- JanusWebRTCServer
- Value too long for column
- 코루틴 컨텍스트
- JanusWebRTC
- 겨울 부산
- 코루틴 빌더
- 개성국밥
Archives
너와 나의 스토리
[Java] 멀티 스레드 - 우선순위 설정 / 동기화 본문
반응형
프로세스 vs 스레드
- 프로세스
- 운영체제에서는 실행 중인 하나의 애플리케이션
- 사용자가 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션의 코드를 실행하는데 이것이 프로세스이다.
- 하나의 애플리케이션에서 여러 개의 프로세스가 만들어질 수 있다.
- 스레드
- 하나의 코드 실행 흐름
멀티 태스킹(Multi tasking)
- 여러 개의 작업을 동시에 처리하는 것
- 운영체제는 멀티 테스킹을 할 수 있도록 CPU 및 메모리 자원을 프로세스마다 적절히 할당해주고, 병렬로 실행시킨다.
- 멀티 태스킹의 예
- 멀티 프로세스(Multi process): 여러개의 프로세스를 병렬로 실행
- 멀티 스레드(Multi thread): 하나의 프로세스 내에서 여러개의 작업을 병렬로 처리
Multiprocessing vs Multithreading
- 멀티 프로세스는 운영체제에서 할당받은 자신의 메모리를 가지고 실행하기 때문에 서로 독립적.
- 하나의 프로세스에서 오류가 발생해도 다른 프로세스에 영향을 미치지 않음.
- 멀티 스레드는 하나의 프로세스 내부에 생성되어 스레드끼리 메모리 공간을 서로 공유하기 때문에
- 하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있다.
메인 스레드(Main thread)
- 모든 자바 애플리케이션은 메인 스레드가 main() 메서드를 실행시키면서 시작된다.
- 메인 스레드는 필요에 따라 작업 스레드들을 만들어서 병렬로 코드를 실행할 수 있다. -> 멀티 스레드 애플리케이션
- 모든 스레드가 종료되어야만 프로세스가 종료된다.
작업 스레드
작업 스레드 객체 생성
- Runnable을 매개 값으로 갖는 생성자를 호출해야 한다.
Thread thread = new Thread(Runnable target);
- Runnable은 인터페이스 타입이기 때문에 구현 객체를 만들어 대입해야 한다.
- 그리고, run() 메서드를 재정의해 작업 스레드가 실행할 코드를 작성해야 한다.
class Task implements Runnable {
public void run() {
// 스레드가 실행할 코드
}
}
- 이렇게도 사용 가능
Thread thread = new Thread(() -> {
// 스레드가 실행할 코드
});
작업 스레드 실행
- 이 명령을 이용해 run() 메서드를 실행시킨다.
thread.start();
- Runnable을 상속받아 thread를 만드는 것이 아니라, Thread의 하위 클래스로 작업 스레드를 정의할 수 있다.
class WorkThread extends Thread {
@Override
public void run() {
// 스레드가 실행할 코드
}
}
Thread thread = new WorkThread();
스레드 이름 설정
thread.setName("thread name");
- 이름 조회
thread.getName();
현재 스레드의 참조 얻기
- 현재 코드를 실행 중인 스레드 객체를 얻을 수 있다.
Thread thread = thread.currentThread();
스레드 우선순위
- 멀티 스레드는 동시성 또는 병렬성으로 실행된다.
- 동시성(Concurrency): 멀티 테스킹을 위해 하나의 코어에서 멀티 스레드가 번갈아가며 실행하는 성질
- 실제로 동시에 수행되는 것이 아니라, 빠르게 번갈아가며 실행됨.
- 병렬성(Parallelism): 멀티 테스킹을 위해 멀티 코어에서 개별 스레드를 동시에 실행하는 성질
- 동시성(Concurrency): 멀티 테스킹을 위해 하나의 코어에서 멀티 스레드가 번갈아가며 실행하는 성질
- 스레드 스케줄링: 스레드를 어떤 순서로 동시성을 실행할 것인지 결정하는 것
- 자바의 스레드 스케줄링은 우선순위(Priority) 방식과 순환 할당(Round-Robin) 방식을 사용한다.
- Priority 방식: 우선순위가 높은 스레드가 실행 상태를 더 많이 가짐
- Round-Robin: time slice를 정해 하나의 스레드를 정해진
- JVM에 의해 정해지기 때문에 개발자가 코드로 제어 불가.
Priority 방식
- 우선순위 설정
- 1~10으로 부여하면 됨.
- 우선 순위 높을수록 작업 빨리 끝남
- 우선순위 부여 안 하면 디폴트로 5가 부여됨
- 1~10 값 직접 입력해도 되고, Thread 클래스 상수로 줄 수도 있다.
- Thread.MAX_PRIORITY
- Thread.NORM_PRIORITY
- Thread.MIN_PRIORITY
- 1~10으로 부여하면 됨.
thread.setPriority(우선순위);
동기화 메서드 및 동기화 블록
- 임계 영역(Critical) section: 멀티 스레드 프로그램에서 단 하나의 스레드만 실행할 수 있는 코드 영역
- 자바는 임계 영역을 지정하기 위해 동기화(synchronized) 메서드와 동기화 블록을 제공한다.
동기화 메서드를 만드는 방법
- synchronized 키워드 붙이기
- synchronized 키워드는 인스턴스와 정적 메서드 어디든 붙일 수 있다.
public synchronized void method() {
}
- 동기화 메서드는 메서드 전체가 임계 영역이다.
동기화 블럭
- 일부 코드 부분만 임계 영역으로 만들고 싶다면 다음과 같이 동기화 블럭을 만들면 된다.
public void method() {
// ...
synchronized(공유객체) {
// 임계 영역
}
// ...
}
출처:
- [이것이 자바다]
반응형
'Programming Language > Java' 카테고리의 다른 글
Java로 websocket 통신하는 예제 + 삽질 기록 (0) | 2023.09.12 |
---|---|
[Java] 코드 내에서 File 실행 권한 주기 (0) | 2021.04.26 |
[Java Exception] 예외와 예외 클래스 / 예외 처리 (0) | 2021.04.21 |
[Java] 익명 객체(Anonymous Object) (0) | 2021.04.20 |
[Java] 중첩 클래스와 중첩 인터페이스 (0) | 2021.04.19 |
Comments