sleep 대기와 join 대기의 종료 조건

시간 추측과 실제 thread 종료 사건을 같은 것으로 취급하지 않는다.

Thread.sleep(100)

호출자만 일정 시간 쉬고 worker 상태는 확인하지 않는다

time assumption

worker.join()

대상 run이 끝날 때 호출자가 깨어난다

event condition
시간 제한이 필요하면timed join 뒤 isAlive와 취소 정책을 확인한다

핵심: CI 부하와 GC pause가 바뀌어도 기능 순서는 사건 기반이어야 한다.