Executors
& ExecutorService
사용하여 구현
java.util.concurrent
패키지에서 제공Runnable
을 대기열에 추가하면 자리가 나는대로 태워보냄쓰레드 풀 | 자전거 대여 업체 |
---|---|
쓰레드 | 업체 소유 자전거 |
(대수 지정, 사용 후 반납 & 재사용) | |
Runnable |
이용자 |
(자전거가 모두 이용중이면 대기) |
Runnable
) 한 명씩 투입
📁 ex01
☕ Cave.java
public class Cave {
private int water = 40;
public int getWater() {
return water;
}
public void pump() {
if (getWater() > 0) water--;
}
}
☕ VolunteerRun.java
public class VolunteerRun implements Runnable {
private static int lastNo = 0;
private static int working = 0;
private int no;
private Cave cave;
public VolunteerRun(Cave cave) {
this.no = ++lastNo;
this.cave = cave;
System.out.printf(
"🦺 %d번 지원자 투입 (남은 물 양: %d)%n", no, cave.getWater()
);
}
@Override
public void run() {
working++;
System.out.printf(
"🪣 %d번 지원자 시작 (현재 %d명 펌핑중, 남은 물 %d)%n",
no, working, cave.getWater()
);
try { Thread.sleep(5000);
} catch (InterruptedException e) {
// 💡 아래의 return이 없다면 shutdownNow를 해도 중단되지 않음
// - 주석해제하고 shutdownNow 버전으로 다시 실행해 볼 것
//working--;
//System.out.printf(
// "🛑 %d번 지원자 중단 (현재 %d명 펌핑중, 남은 물 %d)%n",
// no, working, cave.getWater()
//);
//return;
}
cave.pump();
working--;
System.out.printf(
"✅ %d번 지원자 완료 (현재 %d명 펌핑중, 남은 물 %d)%n",
no, working, cave.getWater()
);
}
}
☕ Main.java