* 프로세스(process) : 실행 중인 하나의 애플리케이션
* 멀티태스킹(multi tasking) : 두 가지 이상의 작업을 동시에 처리하는 것, 운영체제는 멀티태스킹을 할 수 있도록 cpu 및 메모리 자원을 프로세스마다 할당하고 병렬로 실행시킴
* 한 프로세스 내에서 멀티 태스킹 가능 ex) 미디어 플레이어, 메신저
-> 멀티 스레드(multi thread) : 하나의 스레드는 하나의 코드 실행 흐름
* 메인 스레드(main thread)
모든 자바 애플리케이션은 메인 스레드가 main() 메소드를 실행하면서 시작됨
메인 스레드는 멀티 스레드를 생성해서 멀티 태스킹을 수행 가능
싱글 스레드 앱은 메인 스레드가 종료되면 프로세스도 종료되지만, 멀티 스레드 앱은 실행 중인 스레드가 하나라도 있다면 프로세스는 종료되지 않음
* 작업 스레드 생성과 실행
1) Thread 클래스로부터 직접 생성
Thread thread = new Thread(new Runnable() {
public void run() {
스레드가 실행할 코드;
}
} );
thread.start(); -> 작업스레드는 매개값으로 받은 Runnable의 run() 메소드를 실행하면서 자신의 작업 처리
2) Thread 하위 클래스로부터 생성
Thread의 하위 클래스로 작업 스레드를 정의하면서 작업 내용을 포함(메소드 재정의)
public class WorkerThread extends Thread{
@Override
public void run() {
// 스레드가 실행할 코드
}
}
thread.start() -> 작업 스레드는 자신의 run() 메소드를 실행
* 스레드 우선순위
동시성(Concurrency) : 멀티 작업을 위해 하나의 코어에서 멀티 스레드가 번갈아가며 실행하는 성질
병렬성(Parallelism) : 멀티 작업을 위해 멀티 코어에서 개별 스레드를 동시에 실행하는 성질
스레드 스케줄링 : 스레드의 개수가 코어의 수보다 많을 경우, 스레드를 어떤 순서에 의해 동시성으로 실행할 것인가 결정
1) 우선순위(priority)방식 : 우선순위가 높은 스레드가 실행 상태를 더 많이 가지도록 스케줄링
스레드에 객체에 우선순위 번호를 부여할 수 있기 때문에 개발자가 코드로 제어 가능
1(우선순위 낮음) ~ 10(우선순위 높음), 우선순위 부여하지 않을 경우 기본적으로 5 할당
setPriority() 메소드를 이용하여 우선순위 변경
2) 순환할당(Round-Robin)방식 : 시간 할당량(Time slice)을 정해서 하나의 스레드를 정해진 시간만큼 실행하고 다시 다른 스레드를 실행
자바 가상 기계에 의해서 정해지기 때문에 코드로 제어 x
* 동기화 메소드 및 동기화 블록
임계 영역(critical section) : 멀티 스레드 프로그램에서 단 하나의 스레드만 실행할 수 있는 코드 영역
-> 자바는 임계 영역을 지정하기 위해 동기화 메소드와 동기화 블록을 제공
스레드가 객체 내부의 동기화 메소드 or 블록에 들어가면 즉시 객체에 잠금을 걸어 다른 스레드가 임계 영역 코드를 실행하지 못하도록 함
public synchronized void method() {
임계 영역; // 단 하나의 스레드만 실행
}
public void method() {
// 여러 스레드가 실행 가능 영역
synchronized(공유객체) {
임계 영역 // 단 하나의 스레드만 실행
}
}
* 스레드 상태
상태 | 열거 상수 | 설명 |
객체 생성 | NEW | 스레드 객체가 생성, 아직 start() 메소드가 호출되지 않은 상태 |
실행 대기 | RUNNABLE | 실행 상태로 언제든지 갈 수 있는 상태 |
일시 정지 | WAITING | 다른 스레드가 통지할 때까지 기다리는 상태 |
TIMED_WAITING | 주어진 시간 동안 기다리는 상태 | |
BLOCKED | 사용하고자 하는 객체의 락이 풀릴 때까지 기다리는 상태 | |
종료 | TERMINATED | 실행을 마친 상태 |
* 스레드 상태 제어
실행 중인 스레드의 상태를 변경하는 것
메소드 | 설명 |
interrupt() | 일시 정지 상태의 스레드에서 InterruptedException 예외를 발생시켜, 예외 처리 코드(catch)에서 실행 대기 상태로 가거나 종료 상태로 갈 수 있도록 한다. |
notify() notifyAll() |
동기와 블록 내에서 wait() 메소드에 의해 일시 정지 상태에 있는 스레드를 실행 대기 상태로 만든다. |
resume() |
suspend() 메소드에 의해 일시 정지 상태에 있는 스레드를 실행 대기 상태로 만든다. - Deprecated (대신 notify(), notifyAll() 사용) |
sleep() | 주어진 시간 동안 스레드를 일시 정지 상태로 만든다. 주어진 시간이 지나면 자동적으로 실행 대기 상태가 된다. |
join() | join() 메소드를 호출한 스레드는 일시 정지 상태가 된다. 실행 대기 상태로 가려면, join() 메소드를 멤버로 가지는 스레드가 종료되거나, 매개값으로 주어진 시간이 지나야 한다. |
wait() | 동기화 블록 내에서 스레드를 일시 정지 상태로 만든다. 매개값으로 주어진 시간이 지나면 자동적으로 실행 대기 상태가 된다. 시간이 주어지지 않으면 notify(), notifyAll() 메소드에 의해 실행 대기 상태로 갈 수 있다. |
suspend() |
스레드를 일시 정지 상태로 만든다. resume() 메소드를 호출하면 다시 실행 대기 상태가 된다. - Deprecated (대신 wait() 사용) |
yield() | 실행 중에 우선순위가 동일한 다른 스레드에게 실행을 양보하고 실행 대기 상태가 된다. |
stop() | 스레드를 즉시 종료시킨다. - Deprecated |
* 데몬 스레드(daemon thread)
주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드(주 스레드 종료시 자동 종료됨)
ex) 워드프로세서의 자동 저장, 미디어 플레이어의 동영상 및 음악 재생, 가비지 컬렉터
* 스레드 그룹
관련된 스레드를 묶어서 관리할 목적으로 이용
JVM 실행 -> system 스레드 그룹 만듦 -> JVM 운영에 필요한 스레드들을 생성 -> system 스레드 그룹에 포함 -> 하위 스레드 그룹으로 main 만듦 -> 메인 스레드를 main 스레드 그룹에 포함
스레드는 반드시 하나의 스레드 그룹에 포함(명시적으로 하지 않으면 기본적으로 자신을 생성한 스레드와 같은 스레드 그룹에 속함)
- 스레드 그룹 생성 : ThreadGroup tg = new ThreadGroup(ThreadGroup parent, String name);
스레드 그룹의 일괄 interrupt()
* 스레드풀(ThreadPool)
갑작스런 병렬 작업의 폭증으로 인한 스레드의 폭증을 막기 위해 사용
작업 처리에 사용되는 스레드를 제한된 개수만큼 정해놓고 작업 큐(Queue)에 들어오는 작업들을 하나씩 스레드가 맡아 처리
- 작업 생성
Runnable 구현 클래스 | Callable 구현 클래스 |
Runnable task = new Runnable() { @Override public void run() { // 스레드가 처리할 작업 내용 } } |
Callable<T> task = new Callable<T>() { @Override public T call() throws Exception { // 스레드가 처리할 작업 내용 return T; } } |
- 작업 완료 통보
'Programming Language > Java' 카테고리의 다른 글
이것이 자바다 14 (0) | 2019.08.01 |
---|---|
이것이 자바다 13 (0) | 2019.07.26 |
이것이 자바다 10 (0) | 2019.07.08 |
이것이 자바다 09 (0) | 2019.07.03 |
이것이 자바다 08 (0) | 2019.07.01 |