- 옵저버 패턴에 대한 내용
1. 스레드(Thread)란?
- 프로그래밍 실행 단위의 가장 작은 단위
- 하나의 프로세스는 여러 개의 스레드를 가질 수 있습니다.
- 각 스레드는 독립적으로 실행되지만 같은 프로세스 내의 다른 스레드와 메모리 공간을 공유합니다.
2. 소스 코드 예시
// 옵저버 패턴 -> 콜백
public class App {
// 1번 스레드 main
public static void main(String[] args) {
// 1. 객체 생성 init
Pub pub = new Pub();
SubListener sub1 = new Sub1();
SubListener sub2 = new Sub2();
// 구독하기
pub.add(sub1);
pub.add(sub2);
// 2. 마트에 상품 입고하는 2번 스레드
new Thread(() -> {
try {
// 10초 뒤 상품 입고
Thread.sleep(10000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// 상품 입고
pub.income();
}).start(); // start: 새로운 스레드 시작
// 3. 마트 3번 스레드
new Thread(() -> {
while (true) {
if(pub.value == null) {
System.out.println("상품 미입고..");
} else {
pub.notifyChange(pub.value+ " 입고됨");
break; // 입고되면 멈춤
}
try {
// 1초마다 상품이 있는지 체크
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}).start();
// 총 스레드는 main까지 해서 3개
} // main이 종료되도 프로그램 종료 x -> 스레드 1개라도 살아있으면 유지
}
- 스레드는 총 3개입니다.
- main
- 마트에 상품 입고
- 상품 입고를 체크하는 마트
- main 스레드만 있으면 소스 코드를 다 실행 후 프로그램이 종료되지만 스레드가 더 있으면 종료되지 않습니다.
3. Thread.sleep(10000);
현재 실행 중인 스레드를 10초(10000 밀리초) 동안 일시 중단합니다.
- InterruptedException 처리를 위해 try/catch 문 사용
- InterruptedException
- 스레드가 일시 중단 상태일 때 다른 스레드가 이 스레드를 interrupt할 경우 발생하는 예외
4. 람다식(Lambda Expression)
람다식은 자바 8부터 도입된 기능으로, 익명 함수(Anonymous Function)를 간결하게 표현할 수 있는 방법입니다.
- new Thread() { }
- Thread 생성자는 매개변수로 Runnable 인터페이스를 구현한 클래스가 필요합니다.
- Runnable 인터페이스를 구현한 클래스 안에는 run 메서드가 정의되어 있어야 합니다.
- Thread가 처리하는 소스 코드는 run 메서드 입니다.
람다식 (() -> { run 메서드 내용 })
- Runnable 인터페이스를 구현한 클래스의 run 메서드를 정의하는 과정을 생략하고 람다식으로 짧게 표현 가능합니다.
Share article