Contents
출력옵저버 패턴 흐름을 스레드로 처리하는 방식
옵저버 패턴은 상태 변화 시 구독자들에게 알림. 스레드는 알림을 비동기적 처리
비동기적 처리: 작업이 완료되기를 기다리지 않고 다른 작업을 동시에 진행
응용
while
문: 옵저버가 상품 입고와 같은 상태 변화를 실시간 체크
- 옵저버 패턴 활용해 주체 변화전까지 대기 스레드로 대기해 실제 상태 변화를 비동기적 처리, 상품 입고 시 바로 알림
package ch08;
import ch08.pub.Pub;
import ch08.sub.Sub1;
import ch08.sub.Sub2;
import ch08.sub.SubListener;
// OS에 스레드 요청 > run을 때림 > 다하면 스레드 생명주기 종료
public class App {
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. 마트 상품 입고 스레드
new Thread(()->{
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
pub.income(); // 상품 들어옴
}).start();
// 3. 마트 스레드
new Thread(()->{
while (true) { // while 옵저버 응용 -연결이 끊기면 안된다
if (pub.value == null) {
System.out.println("상품 미입고..");
} else {
pub.notifyChange(pub.value + "입고됨");
break; // 입고 시 종료
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}).start();
}
}
package ch08.pub;
import ch08.sub.SubListener;
import java.util.ArrayList;
import java.util.List;
public class Pub {
public String value = null;
public void income() { // 물건
value = "바나나";
}
public List<SubListener> subList = new ArrayList<>();
public void add(SubListener sub) {
subList.add(sub);
}
public void notifyChange(String msg) {
for(SubListener sub : subList){
sub.update(msg);
}
}
}
package ch08.sub;
public class Sub1 implements SubListener {
@Override
public void update(String msg) {
System.out.println("Sub1이 받은 알림: " + msg);
}
}
package ch08.sub;
public class Sub2 implements SubListener {
@Override
public void update(String msg) {
System.out.println("Sub2가 받은 알림: " + msg);
}
}
package ch08.sub;
public interface SubListener {
void update(String msg);
}
출력

Share article