[디자인 패턴] 옵저버 패턴과 스레드(Thread) 응용

KangHo Lee's avatar
Nov 14, 2024
[디자인 패턴] 옵저버 패턴과 스레드(Thread) 응용
  • 옵저버 패턴에 대한 내용

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

devleekangho