반응형
1. 프로세스(process)와 스레드(thread)
스레드는 거미줄, 실타래라는 의미를 가지고 있습니다.
1.1 작업 관리자에서 프로세스와 스레드 확인
1.1.2 프로세스(process)와 스레드(thread)
- 프로세스(process): 실행 중인 프로그램
- 스레드(thread): 프로세스 내 작업 단위
1.1.3 프로세스의 메모리 구조
2. 싱글 스레드(Single Thread)와 멀티 스레드(Multi Thread)
3. 멀티 스레드를 사용해야 하는 경우
3.1 GUI 프로그래밍
GUI 프로그래밍에서는 main
스레드에서만 UI 를 그리거나 갱신할 수 있음
3.2 시간이 오래 걸리는 작업
시간이 오래 걸리는 작업의 경우 ANR(Application Not Responding) 현상을 방지하기 위해 백그라운드에서 실행하는 별도의 스레드가 필요함
3.3 3.2 에서 멀티 스레드를 사용하지 않으면?
그렇지 않으면 화면을 갱신하고자 하는 모든 코드는 block 당하여 ANR 이 발생하게 됨
4. 멀티 스레드의 장단점
4.1 장점
- 자원을 더욱 효율적으로 사용할 수 있다.
- 사용자에 대한 응답성(responseness)이 향상된다.
- 작업이 분리되어 코드가 간결해진다.
4.2 단점
- 동기화(synchronization)에 주의해야 한다.
- 교착상태(deadlock)가 발생하지 않도록 주의해야 한다.
- 각 스레드가 효율적으로 고르게 실행될 수 있게 해야 한다.
5. 스레드의 구현과 실행
5.1 Thread
클래스를 상속
public class MyThread extends Thread {
// Thread 클래스의 run() 메서드를 오버라이딩
public void run() {
// (...)
}
}
5.2 Runnable
인터페이스를 구현
public class MyThread implements Runnable {
// Runnable 인터페이스의 run() 추상 메서드를 구현
public void run() {
// (...)
}
}
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
public class MyThreadShell {
public static void main(String[] args) {
ThreadEx1_1 t1 = new ThreadEx1_1();
Runnable r = new ThreadEx1_2();
// 생성자 Thread(Runnable target)
Thread t2 = new Thread(r);
// Thread t2 = new Thread(new ThreadEx1_2());
}
}
6. 스레드의 우선순위
6.1 우선순위의 설정
Thread#setPriority(int requestedPriority)
NORM_PRIORITY
: 5 (default)MIN_PRIORITY
: 1MAX_PRIORITY
: 10
e.g. 출력하는 상황
6.2 우선순위가 높은 스레드에 CPU 실행 시간을 더 할애함
6.3 우선순위가 높은 스레드가 일반적으로 더 빨리 실행됨
e.g. 버스전용차선이 일반적으로 빠르지만 항상 빠르지는 않음
6.3.1 우선순위가 같은 경우
(graph)
6.3.2 A의 우선순위가 높은 경우
(graph)
// 스레드의 우선순위를 지정한 값으로 변경한다.
void setPriority(int newPriority);
// 스레드의 우선순위를 반환한다.
int getPriority();
// 최대우선순위
public static final int MAX_PRIORITY = 10;
// 최소우선순위
public static final int MIN_PRIORITY = 1;
// 보통우선순위
public static final int NORM_PRIORITY = 5;
7. 스레드의 동기화 - synchronized
(image)
한 번에 하나의 스레드만 객체에 접근할 수 있도록 객체에 락(lock)을 걸어서 데이터의 일관성을 유지하는 것
7.1 특정한 개체에 lock 을 걸고자 할 때
synchronized(객체의 참조변수) {
// (...)
}
7.2 메서드에 lock 을 걸고자 할 때
public synchronized void calculateSum() {
// (...)
}
public synchronized void withdraw(int money) {
if (balance >= money) {
try {
Thread.sleep(1000);
} catch (Exception e) {
}
balance -= money;
}
}
public void withdraw(int money) {
synchronized (this) {
if (balance >= money) {
try {
Thread.sleep(1000);
} catch (Exception e) {
}
balance -= money;
}
}
}
8. 실습 예제
먼저 싱글 스레드와 멀티 스레드가 어떤 점이 다른지 살펴봅시다.
8.1 SingleThread.java
8.2 ThreadExam.java
cf.
- super.: 부모 클래스의 멤버
- super(): 부모 클래스의 생성자
- this.: 현재 클래스의 멤버
- this(): 현재 클래스의 생성자
- @override: 부모 클래스의 메서드를 자식 클래스에서 재정의
- overloading: 같은 클래스에서 메서드 이름이 중복
8.5 ExternThread.java
반응형