type Job = Box<dyn FnOnce() + Send + 'static>처럼 워커 스레드로 이동 가능한 클로저만 큐에 넣습니다.
thread pool
스레드풀 작업 분배와 종료
ThreadPool은 요청 클로저를 mpsc 큐에 보내고, 여러 Worker가 Arc<Mutex<Receiver<Job>>>를 잠가 하나씩 꺼내 실행합니다.
loop에서 receiver.lock().unwrap().recv()를 호출하고, Ok(job)은 실행하며 Err(_)는 종료 신호로 보고 빠져나옵니다.
ThreadPool은 Sender<Job>를 보관하고 execute에서 send합니다. send 실패는 이미 종료 중인 풀에 작업을 넣었다는 신호입니다.
Drop에서 sender.take() 후 handle.join()을 호출합니다. 작업 panic은 join 결과로 드러나므로 로깅·재시작 정책을 정합니다.