Object
의 쓰레드 관련 메소드들wait
: 동기화 메소드 사용 중 자기 일을 멈춤
notify
: 일을 멈춘 상태의 쓰레드에게 자리가 비었음을 통보
notifyAll
: 대기중인 모든 쓰레드에 통보
notify
보다 일반적으로 널리 사용📁 ex01
☕ PhoneBooth.java
public class PhoneBooth {
synchronized public void phoneCall (SoldierRun soldier) {
System.out.println("☎️ %s 전화 사용중...".formatted(soldier.title));
try { Thread.sleep(500);
} catch (InterruptedException e) {}
System.out.println("👍 %s 전화 사용 완료".formatted(soldier.title));
// 💡 아래를 해제하지 않으면 첫 사용자가 혼자 다 씀
// ℹ️ 단, JDK 제품마다 차이가 있을 수 있습니다.
//notifyAll();
//try {
// // 💡 현 사용자를 폰부스에서 내보냄
// // - sleep처럼 아래의 예외 반환 확인
// wait();
//} catch (InterruptedException e) {
// throw new RuntimeException(e);
//}
}
}
☕ SoldierRun.java
public class SoldierRun implements Runnable {
String title;
PhoneBooth phoneBooth;
public SoldierRun(String title, PhoneBooth phoneBooth) {
this.title = title;
this.phoneBooth = phoneBooth;
}
@Override
public void run() {
while (true) {
phoneBooth.phoneCall(this);
}
}
}
☕ Main.java
PhoneBooth phoneBooth = new PhoneBooth();
Arrays.stream("김병장,이상병,박일병,최이병".split(","))
.forEach(s -> new Thread(
new SoldierRun(s, phoneBooth)
).start());
📁 ex02
☕ CoffeeMachine.java