7 pub struct ThreadPool
{
9 sender
: mpsc
::Sender
<Message
>,
12 type Job
= Box
<dyn FnOnce() + Send
+ '
static>;
20 /// Create a new ThreadPool.
22 /// The size is the number of threads in the pool.
26 /// The `new` function will panic if the size is zero.
27 pub fn new(size
: usize) -> ThreadPool
{
30 let (sender
, receiver
) = mpsc
::channel();
32 let receiver
= Arc
::new(Mutex
::new(receiver
));
34 let mut workers
= Vec
::with_capacity(size
);
37 workers
.push(Worker
::new(id
, Arc
::clone(&receiver
)));
40 ThreadPool { workers, sender }
43 pub fn execute
<F
>(&self, f
: F
)
45 F
: FnOnce() + Send
+ '
static,
47 let job
= Box
::new(f
);
49 self.sender
.send(Message
::NewJob(job
)).unwrap();
53 impl Drop
for ThreadPool
{
55 println
!("Sending terminate message to all workers.");
57 for _
in &self.workers
{
58 self.sender
.send(Message
::Terminate
).unwrap();
61 println
!("Shutting down all workers.");
63 for worker
in &mut self.workers
{
64 println
!("Shutting down worker {}", worker
.id
);
66 if let Some(thread
) = worker
.thread
.take() {
67 thread
.join().unwrap();
75 thread
: Option
<thread
::JoinHandle
<()>>,
79 fn new(id
: usize, receiver
: Arc
<Mutex
<mpsc
::Receiver
<Message
>>>) -> Worker
{
80 let thread
= thread
::spawn(move || loop {
81 let message
= receiver
.lock().unwrap().recv().unwrap();
84 Message
::NewJob(job
) => {
85 println
!("Worker {} got a job; executing.", id
);
89 Message
::Terminate
=> {
90 println
!("Worker {} was told to terminate.", id
);