2 use std::sync::{Arc, mpsc, Mutex};
4 type Job = Box<dyn FnOnce() + Send + 'static>;
8 thread: Option<thread::JoinHandle<()>>,
12 fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
13 let thread = Some(thread::spawn(move || loop {
14 let job = receiver.lock().unwrap().recv().unwrap();
15 println!("Worker {} got a job, executing", id);
22 pub struct ThreadPool {
24 sender: mpsc::Sender<Job>,
28 /// Create a new thread pool.
33 pub fn new(size: usize) -> ThreadPool {
35 let mut workers = Vec::with_capacity(size);
37 let (sender, receiver) = mpsc::channel();
38 let receiver = Arc::new(Mutex::new(receiver));
41 workers.push(Worker::new(id, Arc::clone(&receiver)));
44 ThreadPool { workers, sender }
47 pub fn execute<F>(&self, f: F)
48 where F: FnOnce() + Send + 'static
50 self.sender.send(Box::new(f)).unwrap();
54 impl Drop for ThreadPool {
56 for worker in &mut self.workers {
57 println!("Shutting down worker {}", worker.id);
59 if let Some(thread) = worker.thread.take() {
60 thread.join().unwrap();