티스토리 뷰
Thread
프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다. 모든 프로세스에는 한 개 이상의 스레드가 존재하고 작업을 수행한다. 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고 한다.
* Process
사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행중인 것을 말한다. 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 스레드로 구성된다. 즉, 실행중인 하나의 어플리케이션.
- JVM에 의해 하나의 프로세스가 발생하고 main() 안의 실행문들이 하나의 스레드이다.
- 실행 중에 멈출 수 있으며 동시에 수행이 가능하다.
- main() 이외의 또 다른 스레드를 생성하려면 Thread 클래스를 상속하거나 Runnable 인터페이스를 구현한다.
- 다중 스레드 작업 시에는 각 스레드끼리 정보를 주고 받을 수 있어서 처리 과정의 오류를 줄일 수 있다.
- 프로세스끼리는 정보를 주고 받을 수 없다.
스레드 생성
1. Thread 클래스를 상속
-> thread 클래스를 상속받으면 다른 클래스를 상속받을 수 없으므로, 일반적으로는 Runnable 인터페이스를 구현한다.
2. Runnable 인터페이스를 구현
|
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
29
30
31
32
|
class ThreadWithClass extends Thread {
public void run() {
// logic
}
}
class ThreadWithRunnable implements Runnable {
// 이 자체가 스래드는 아님. 스래드가 실행할 코드만 포함하고 있는 클래스.
public void run() {
// logic
}
}
public class Test {
public static void main(String[] args){
// Thread 클래스를 상속하여 스레드 선언
ThreadWithClass thread1 = new ThreadWithClass();
// Runnable 인터페이스를 구현하여 스레드 선언
Thread thread2 = new Thread(new ThreadWithRunnable());
thread1.start(); // 스레드의 실행
thread2.start(); // 스레드의 실행
}
}
|
cs |
- 별도 클래스에서의 구현, 무명 구현 객체, 람다식 모두 가능
멀티 스레드
- 멀티 스레드는 메인 스레드가 종료되더라도 실행 중인 스레드가 하나라도 있으면 프로세스가 종료되지 않는다.
- run() 메소드가 종료되면 스레드가 종료된다.
-> 스레드를 계속 실행시키려면 run() 메소드를 무한 루프 속에서 실행시켜야 한다. - 한 번 종료한 스레드는 다시 시작시킬 수 없으며 무한 루프 속에서 실행시켜야 한다.
- 한 스레드에서 다른 스레드를 강제 종료할 수 있다.
- 장점 : 메모리 공유로 인한 시스템 자원 소모가 줄고 동시에 두 가지 이상의 활동을 할 수 있다.
- 단점 : 서로 자원 소모를 하다가 충돌이 일어날 가능성이 존재하며 코딩이 난해해져 버그 생성확률이 높아진다. (동기화, 교착상태 ...)
스레드 상태 6가지
1. NEW : 스레드가 생성되었지만 아직 실행할 준비가 되지 않은 상태
2. RUNNABLE : 스레드가 실행되고 있거나 실행준비되어 스케쥴링을 기다리는 상태
3. WAITING : 다른 스레드가 notify(), notifyAll()을 불러주기를 기다리고 있는 상태
4. TIMED_WAITING : 스레드가 sleep(n) 호출로 인해 n밀리초동안 잠을 자고 있는 상태
5. BLOCK : 스레드가 작업을 완료하지 못하고 잠시 작업을 멈추는 상태. 스레드가 I/O 요청을 하면 자동으로 스레드를 BLOCK 상태로 만듦.
6. TERMINATED : 스레드가 종료한 상태
스레드 우선순위
- 2개 이상의 스레드가 동작 중일 때 우선 순위를 부여하여 우선 순위가 높은 스레드에 실행의 우선권을 부여할 수 있다.
- static final int MAX_PRIORITY : 스레드가 가질 수 있는 최대 우선순위를 명시
- static final int MIN_PRIORITY : 스레드가 가질 수 있는 최소 우선순위를 명시
- static final int NORM_PRIORITY : 스레드가 생성될 때 가지는 기본 우선순위를 명시
- getPriority()와 setPriority() 메소드를 통해 스레드의 우선순위를 반환하거나 변경할 수 있다. 우선순위가 가질 수 있는 범위는 1~10이며 숫자가 높을수록 우선순위가 높아진다.
- main() 스레드의 우선 순위 초기값은 5이다.
'CS > JAVA' 카테고리의 다른 글
| [JAVA] 메모리 구조 (0) | 2021.06.16 |
|---|---|
| [JAVA] 변수의 종류 (0) | 2021.06.16 |
| [JAVA] 접근 제어 지시자 (0) | 2021.06.16 |
| [JAVA] Wrapper Class, Generic (0) | 2021.06.15 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 래퍼 클래스
- 4796
- Wrapper Class
- 11729
- Stack
- CS
- 구간 합 구하기
- generic
- BFS
- 게리맨더링
- 백준
- 조합
- Regex
- 순열
- OOP
- 디자인 패턴
- 백트래킹
- 신규아이디추천
- recursion
- 제네릭
- 15686
- java
- 2529
- 재귀
- 알고리즘
- 프로그래머스
- 와일드카드
- gof
- 11659
- 하노이 탑
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 29 |
| 30 |
글 보관함