diff --git a/src/lib.rs b/src/lib.rs index aecfb6f..3b4b42b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -85,4 +85,26 @@ mod tests { let results = Vec::::new().par_run().unwrap(); assert!(results.is_empty()); } + + #[test] + fn test_builder() { + let task = TestTask(10); + let builder = std::thread::Builder::new().name("custom_thread".to_string()); + let handle = task.start_with_builder(builder); + assert_eq!(handle.join().unwrap(), 20); + + struct BuilderTask; + + impl Runnable for BuilderTask { + type Output = String; + + fn run(self) -> Self::Output { + std::thread::current().name().unwrap().to_string() + } + } + + let builder = std::thread::Builder::new().name("custom_thread".to_string()); + let handle = BuilderTask.start_with_builder(builder); + assert_eq!(handle.join().unwrap(), "custom_thread".to_string()); + } } diff --git a/src/traits.rs b/src/traits.rs index 6a50e17..9d161b8 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -67,12 +67,24 @@ pub trait Thread: Runnable { /// assert_eq!(handle.join().unwrap(), 12); /// ``` fn start(self) -> std::thread::JoinHandle; + + /// Spawns a new thread using a custom [`std::thread::Builder`] to execute the `run` method. + fn start_with_builder( + self, + builder: std::thread::Builder, + ) -> std::thread::JoinHandle; } impl Thread for T { fn start(self) -> std::thread::JoinHandle { std::thread::spawn(move || self.run()) } + fn start_with_builder( + self, + builder: std::thread::Builder, + ) -> std::thread::JoinHandle { + builder.spawn(move || self.run()).unwrap() + } } /// An extension trait that provides a method to run multiple [`Runnable`]'s in parallel. @@ -127,7 +139,7 @@ impl ParallelRun for Vec { if threads == 0 { return Ok(Vec::new()); } - + let chunk_size = self.len().div_ceil(threads); let mut iter = self.into_iter();