Hi most valuable brothers. There is a question in my mind which disturbing me. How the for loop starts multiple threads at a time? All threads needs to join().unwrap() for able to start but how the for loop continues to another thread although the previous thread didn't finish yet. Let me example code:
fn main() -> anyhow::Result<()> {
let mut threads: Vec<JoinHandle<()>> = vec![];
for thread_no in 0..10 {
threads.push(thread::spawn(move || loop {
for counter in 1..10 {
println!("thread_no: {thread_no}, counter: {counter}");
let wait_time_millis = rand::thread_rng().gen_range(100..555);
thread::sleep(Duration::from_millis(wait_time_millis));
}
println!("thread_no: {thread_no}, counters done.");
thread::sleep(Duration::from_millis(1000));
}));
}
for (index, thread) in threads.into_iter().enumerate() {
println!("Starting that thread: {index}");
thread.join().map_err(|_| anyhow!("Thread error."))?;
}
Ok(())
}
Result:
thread_no: 0, counter: 1
thread_no: 1, counter: 1
thread_no: 2, counter: 1
thread_no: 3, counter: 1
thread_no: 6, counter: 1
thread_no: 4, counter: 1
thread_no: 5, counter: 1
thread_no: 7, counter: 1
Starting that thread: 0
thread_no: 8, counter: 1
thread_no: 9, counter: 1
thread_no: 0, counter: 2
thread_no: 9, counter: 2
thread_no: 8, counter: 2
thread_no: 6, counter: 2
thread_no: 4, counter: 2
thread_no: 3, counter: 2
thread_no: 1, counter: 2
thread_no: 0, counter: 3
thread_no: 6, counter: 3
thread_no: 7, counter: 2
thread_no: 2, counter: 2
thread_no: 0, counter: 4
thread_no: 5, counter: 2
thread_no: 4, counter: 3
thread_no: 8, counter: 3
thread_no: 1, counter: 3
thread_no: 6, counter: 4
thread_no: 9, counter: 3
thread_no: 3, counter: 3
thread_no: 7, counter: 3
thread_no: 3, counter: 4
thread_no: 1, counter: 4
thread_no: 0, counter: 5
thread_no: 2, counter: 3
thread_no: 5, counter: 3
thread_no: 7, counter: 4
thread_no: 6, counter: 5
thread_no: 9, counter: 4
thread_no: 4, counter: 4
thread_no: 2, counter: 4
thread_no: 8, counter: 4
thread_no: 0, counter: 6
thread_no: 5, counter: 4
thread_no: 1, counter: 5
thread_no: 3, counter: 5
thread_no: 9, counter: 5
thread_no: 2, counter: 5
thread_no: 1, counter: 6
thread_no: 8, counter: 5
thread_no: 9, counter: 6
thread_no: 7, counter: 5
thread_no: 4, counter: 5
thread_no: 6, counter: 6
thread_no: 5, counter: 5
thread_no: 0, counter: 7
thread_no: 8, counter: 6
thread_no: 3, counter: 6
thread_no: 9, counter: 7
thread_no: 0, counter: 8
thread_no: 2, counter: 6
thread_no: 6, counter: 7
thread_no: 1, counter: 7
thread_no: 4, counter: 6
thread_no: 7, counter: 6
thread_no: 2, counter: 7
thread_no: 5, counter: 6
thread_no: 0, counter: 9
thread_no: 6, counter: 8
thread_no: 8, counter: 7
thread_no: 9, counter: 8
thread_no: 3, counter: 7
thread_no: 1, counter: 8
thread_no: 6, counter: 9
thread_no: 4, counter: 7
thread_no: 9, counter: 9
thread_no: 2, counter: 8
thread_no: 7, counter: 7
thread_no: 8, counter: 8
thread_no: 1, counter: 9
thread_no: 0, counters done.
thread_no: 2, counter: 9
thread_no: 7, counter: 8
thread_no: 5, counter: 7
thread_no: 3, counter: 8
thread_no: 9, counters done.
thread_no: 4, counter: 8
thread_no: 8, counter: 9
thread_no: 6, counters done.
thread_no: 3, counter: 9
thread_no: 4, counter: 9
thread_no: 1, counters done.
thread_no: 2, counters done.
thread_no: 7, counter: 9
thread_no: 5, counter: 8
thread_no: 3, counters done.
thread_no: 4, counters done.
thread_no: 8, counters done.
thread_no: 5, counter: 9
thread_no: 7, counters done.
thread_no: 0, counter: 1
thread_no: 9, counter: 1
thread_no: 6, counter: 1
thread_no: 9, counter: 2
thread_no: 5, counters done.
thread_no: 1, counter: 1
thread_no: 2, counter: 1
thread_no: 0, counter: 2
thread_no: 6, counter: 2
thread_no: 0, counter: 3
thread_no: 3, counter: 1
As you can see all threads have endless loop and they have their own number and printing it. How is it possible? And I want to draw your attention to that there is that output only one time: Starting that thread: 0 If all threads starting then the next print! must work but it doesn't working. Why?
Thanks for your replies.