티스토리 뷰
스레드 우선 순위
동시성과 병렬성은 다르다.동시성
이란 하나의 코어에서 여러개의 스레드가 번갈아가며 실행하는 성질을 의미하며,병렬성
이란 멀티 코어에서 개별 스레드를 동시에 실행하는 것이다.
결과만 보았을 때는 동시성과 병렬성 모두 동시에 실행되는 것 처럼 보이지만 동시성
은 실제로는 하나의 코어에서 하나의 스레드만 실행하고 있고, 번갈아가면서 실행을 하고 있기에 동시에 실행하는 것 처럼 보이는 것 뿐이다.
만약 코어가 매우 많다면 모든 스레드를 멀티 코어에서 돌리면 가장 이상적인 멀티스레드 환경이 될 것이다.
하지만 실제로 코어의 갯수는 정해져 있고 스레드의 개수가 코어의 수보다 많을 경우 스레드 스케쥴링
을 통해 스레드를 어떤 순서로 동시성으로 실행할 것인지 결정하는 것이 필요하다. 스레드 스케쥴링
에 의해 스레드들은 번갈아가면서 run()
메소드를 조금씩 실행하게 된다.
자바는 우선순위 방식
과 순환할당
방식으로 스레드 스케쥴링을 구현하고 있다.
우선순위 방식은 우선순위가 높은 스레드가 실행 상태를 더 많이가지도록 스케쥴링 하는 방식이며, 순환 할당 방식은 시간할당량을 정하여 하나의 스레드를 정해진 시간만큼 실행하는 방식이다.
스레드 우선순위는 1부터 10까지의 값을 설정할 수 있다. 별도로 우선순위를 설정하지 않으면 모든 스레드들은 기본적으로 5의 우선순위를 할당하게 된다. 우선순위를 변경하기 위해서는 thread.setPriority(10)
과 같이 사용하면 된다.
만약 스레드의 수가 코어의 수보다 작다면 우선순위는 별 의미가 없다. 하지만 스레드의 수가 코어의 수보다 많다면 모든 스레드를 병렬로 처리할 수 없으므로 그때는 스레드의 우선순위가 역할을 하게 된다.
동기화 메소드 와 동기화 블록
멀티스레드가 하나의 객체를 공유하면서 생기는 문제가 발생할 수 있다.
예를들어, 두개 이상의 스레드가 같은 객체를 참조하고 있는 상황이라고 하자.
1번 스레드가 객체의 값을 변경하고 1초간 정지했다가 변경한 값을 출력하고자 한다.
하지만, 1번 스레드가 1초간 정지하는 동안에 2번스레드가 해당 객체에 접근하여 값을 바꿔 버렸다.
이렇게 되면 1번스레드가 1초후에 다시 값을 출력할때 원하는 값이 출력되지 않을 수 있다.
이처럼 여러개의 스레드가 객체를 공유하게되면 값이 변경되어 원하는 결과값이 나오지 않을 가능성이 있다.
이런 문제를 해결하기 위해서 동기화 메소드
및 동기화 블록
을 사용하게 된다.
이는 단 하나의 스레드만 실행할 수 있는 메소드 또는 블 록을 의미하며 다른 스레드는 실행이 끝날 때 까지 대기해야 한다.
동기화 메소드를 만드는 방법은 메소드에 synchronized
키워드를 붙이면 된다.
public synchronized void method() {
//임계 영역
}
동기화 블록을 만드는 방법은 메소드 내에서 synchronized
블록을 생성하면 된다.
public void method() {
//여러 스레드가 실행 가능한 영역
synchronized(공유객체) {
//단 하나의 스레드만 실행 가능한 임계영역
}
}
데몬 스레드
스레드는 일반적으로 실행 된 후에 자신의 작업을 완료할 때까지 계속 실행된다. 따라서, 만약 자신의 스레드가 무한반복 실행되는 스레드라면 해당 프로세스는 영원히 종료되지 않을 수 있다.
하지만 자신을 생성한 스레드가 종료되었다면 자신 역시 종료되어야 하는 경우가 있을 수 있다. main 스레드가 종료되어 프로그램이 종료되었는데 스레드는 계속 돌고있으면 안되는 것과 같은 것이다.
이렇게 일반 스레드가 모두 종료되면 함꼐 종료되는 스레드를 데몬 스레드라고 부른다.
데몬스레드를 설정하는 방법은 Thread클래스의 setDeamon()
메소드를 이용하면 된다.
void setDaemon(boolean on)
의 형태를 가지고 있다.
데몬스레드를 생성할 때 주의해야 할점은 스레드를 start()
하기 전에 설정해야 한다는 점이다.
스레드가 이미 실행되고 나면 데몬 설정은 변경할 수 없다.
'Java' 카테고리의 다른 글
[JAVA] 자바 스트림(Stream) (0) | 2022.03.12 |
---|---|
[JAVA] 자바 스레드 풀(Thread Pool) (0) | 2022.03.04 |
[JAVA] 자바 스레드 생성 및 실행 (0) | 2022.03.04 |
[JAVA] 자바 객체를 복제하는 방법 (0) | 2022.03.03 |
[JAVA] 자바 예외처리와 예외 클래스 (0) | 2022.03.03 |
- Total
- Today
- Yesterday
- dfs
- ReactNative
- 재귀
- 시뮬레이션
- BFS
- nestjs
- boj
- 세그먼트 트리
- nest.js
- 백트래킹
- 중앙대학교
- node.js
- 컴퓨터 구조
- 컴퓨터 통신
- 예외처리
- 자바
- 알고리즘
- Computer Architecture
- 구현
- 스레드
- nodeJS
- 그래프
- 동적계획법
- 백준
- typeORM
- java
- 그리디
- 자바스크립트
- 벨만포드
- 투포인터
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |