thread_test.rs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. use std::thread;
  2. use std::time::{Duration, SystemTime, UNIX_EPOCH};
  3. use std::sync::{Arc, Mutex};
  4. use std::io::{self, Write};
  5. struct Runner1 {
  6. number: Arc<Mutex<f64>>,
  7. }
  8. impl Runner1 {
  9. fn new(number: f64) -> Runner1 {
  10. Runner1 {
  11. number: Arc::new(Mutex::new(number)),
  12. }
  13. }
  14. fn run(&self) -> io::Result<()> {
  15. let mut stdout = io::stdout();
  16. loop {
  17. let number = *self.number.lock().unwrap();
  18. writeln!(stdout, "Current number: {}", number)?;
  19. thread::sleep(Duration::from_millis(100));
  20. }
  21. }
  22. fn update_number(&self) -> Box<dyn Fn(f64) + Send + Sync> {
  23. let number = Arc::clone(&self.number);
  24. Box::new(move |new_number: f64| {
  25. let mut num = number.lock().unwrap();
  26. *num = new_number;
  27. })
  28. }
  29. }
  30. struct Runner2 {
  31. update_hook: Box<dyn Fn(f64) + Send + Sync>,
  32. }
  33. impl Runner2 {
  34. fn new(update_hook: Box<dyn Fn(f64) + Send + Sync>) -> Runner2 {
  35. Runner2 {
  36. update_hook,
  37. }
  38. }
  39. fn run(&self) -> io::Result<()> {
  40. let mut stdout = io::stdout();
  41. loop {
  42. let now = SystemTime::now();
  43. let since_the_epoch = now.duration_since(UNIX_EPOCH).unwrap();
  44. let secs = since_the_epoch.as_secs();
  45. let new_number = secs as f64;
  46. (self.update_hook)(new_number);
  47. writeln!(stdout, "Number after run2: {}", new_number)?;
  48. thread::sleep(Duration::from_millis(100));
  49. }
  50. }
  51. }
  52. #[tokio::test]
  53. async fn test_thread() {
  54. let runner1 = Arc::new(Runner1::new(1.0));
  55. let runner2 = Runner2::new(runner1.update_number());
  56. let handle1 = thread::spawn(move || {
  57. let _ = runner1.run();
  58. });
  59. let handle2 = thread::spawn(move || {
  60. let _ = runner2.run();
  61. });
  62. let _ = handle1.join();
  63. let _ = handle2.join();
  64. }