use std::thread; use crossbeam_channel::bounded; fn main() { let (s, r) = bounded(100); let mut ts = vec![]; for ti in 0..4 { let copied_sender = s.clone(); let t = thread::spawn(move|| { println!("Start: {}", ti); for i in 0..100000_u64 { copied_sender.send(Some(i)).unwrap(); } println!("End: {}", ti); }); ts.push(t); } let tt = thread::spawn(move || { println!("Start collect"); let mut sum = 0_u64; loop { let x = r.recv().unwrap(); match x { None => break, Some(x) => sum+=x, } } println!("Enc collect"); println!("Sum: {}", sum); }); for t in ts { t.join().unwrap(); } s.send(None).unwrap(); tt.join().unwrap(); }