Threads let your program do many things at the same time. This helps your program run faster and handle multiple tasks smoothly.
When you want to download files while still letting the user click buttons.
When you want to do heavy calculations without freezing the screen.
When you want to listen for messages and respond quickly.
When you want to run multiple tasks in parallel to save time.
Syntax
Rust
use std::thread;
fn main() {
let handle = thread::spawn(|| {
// code to run in new thread
});
handle.join().unwrap();
}
thread::spawn starts a new thread and runs the code inside the closure.
handle.join() waits for the thread to finish before continuing.
Examples
This example starts a thread that prints a message, then waits for it to finish.
Rust
use std::thread;
fn main() {
thread::spawn(|| {
println!("Hello from a thread!");
}).join().unwrap();
}
This example counts numbers in a new thread while the main thread waits.
Rust
use std::thread;
fn main() {
let handle = thread::spawn(|| {
for i in 1..5 {
println!("Counting: {}", i);
}
});
handle.join().unwrap();
}
Sample Program
This program runs two loops at the same time: one in the main thread and one in a new thread. They print numbers with different delays, showing how threads work together.
Rust
use std::thread;
use std::time::Duration;
fn main() {
let handle = thread::spawn(|| {
for i in 1..4 {
println!("Thread counting: {}", i);
thread::sleep(Duration::from_millis(500));
}
});
for i in 1..4 {
println!("Main counting: {}", i);
thread::sleep(Duration::from_millis(300));
}
handle.join().unwrap();
}
OutputSuccess
Important Notes
Threads run independently but can share data carefully using special tools.
Always join threads to make sure they finish before the program ends.
Using threads can make programs faster but also more complex.
Summary
Threads let your program do many things at once.
Use thread::spawn to start a new thread.
Use join() to wait for a thread to finish.
Practice
(1/5)
1. What is the main purpose of using threads in Rust?
easy
A. To make the program run slower
B. To avoid using variables
C. To write code without functions
D. To run multiple parts of a program at the same time
Solution
Step 1: Understand what threads do
Threads allow a program to perform multiple tasks simultaneously, improving efficiency.
Step 2: Match purpose with options
Only To run multiple parts of a program at the same time correctly states that threads run parts of a program at the same time.
Final Answer:
To run multiple parts of a program at the same time -> Option D
Quick Check:
Threads = run tasks simultaneously [OK]
Hint: Threads let programs do many things at once [OK]
Common Mistakes:
Thinking threads slow down the program
Confusing threads with functions
Believing threads remove variables
2. Which of the following is the correct way to start a new thread in Rust?
easy
A. thread::start(|| println!("Hello"));
B. thread::spawn(|| println!("Hello"));
C. thread::run(|| println!("Hello"));
D. thread::create(|| println!("Hello"));
Solution
Step 1: Recall Rust thread syntax
Rust uses thread::spawn to create a new thread.
Step 2: Compare options with correct syntax
Only thread::spawn(|| println!("Hello")); uses thread::spawn correctly.
Final Answer:
thread::spawn(|| println!("Hello")); -> Option B
Quick Check:
Start thread = thread::spawn [OK]
Hint: Use thread::spawn to start threads in Rust [OK]
Common Mistakes:
Using thread::start instead of spawn
Using thread::run or thread::create which don't exist
Missing the closure syntax ||
3. What will the following Rust code print?
use std::thread;
fn main() {
let handle = thread::spawn(|| {
println!("Inside thread");
});
handle.join().unwrap();
println!("Thread finished");
}
medium
A. Inside thread
Thread finished
B. Thread finished
C. Inside thread
D. Thread finished
Inside thread
Solution
Step 1: Understand thread::spawn and join
The thread prints "Inside thread". The main thread waits for it to finish using join().
Step 2: Determine print order
Because join() waits, "Inside thread" prints first, then "Thread finished" prints.
Final Answer:
Inside thread
Thread finished -> Option A
Quick Check:
join() waits, so inside thread prints before main [OK]
Hint: join() waits for thread, so thread prints before main continues [OK]
Common Mistakes:
Assuming main prints first without waiting
Ignoring join() effect
Expecting only one print line
4. Identify the error in this Rust code that uses threads:
use std::thread;
fn main() {
let handle = thread::spawn(|| {
println!("Hello from thread");
});
println!("Main thread");
}
medium
A. Missing call to join(), so main may end before thread finishes
B. thread::spawn is used incorrectly
C. println! macro is used wrong
D. No error, code runs perfectly
Solution
Step 1: Check thread usage
The code starts a thread but does not wait for it to finish with join().
Step 2: Understand consequences
Without join(), the main thread may finish and exit before the spawned thread prints.
Final Answer:
Missing call to join(), so main may end before thread finishes -> Option A
Quick Check:
Always join threads to ensure they complete [OK]
Hint: Always join threads to wait for their completion [OK]
Common Mistakes:
Forgetting to call join()
Thinking thread::spawn syntax is wrong
Assuming println! is incorrect
5. You want to run two threads that each print a message, then print "Done" after both finish. Which code correctly does this?
hard
A. thread::spawn(|| println!("Thread 1")).join().unwrap();
thread::spawn(|| println!("Thread 2"));
println!("Done");
B. let t1 = thread::spawn(|| println!("Thread 1"));
let t2 = thread::spawn(|| println!("Thread 2"));
println!("Done");
C. let t1 = thread::spawn(|| println!("Thread 1"));
let t2 = thread::spawn(|| println!("Thread 2"));
t1.join().unwrap();
t2.join().unwrap();
println!("Done");
D. thread::spawn(|| println!("Thread 1"));
thread::spawn(|| println!("Thread 2"));
thread::spawn(|| println!("Done"));
Solution
Step 1: Understand thread creation and waiting
To ensure "Done" prints after both threads finish, we must join both threads before printing.
Step 2: Analyze options for correct join usage
let t1 = thread::spawn(|| println!("Thread 1"));
let t2 = thread::spawn(|| println!("Thread 2"));
t1.join().unwrap();
t2.join().unwrap();
println!("Done"); creates two threads, joins both, then prints "Done". This guarantees order.
Final Answer:
let t1 = thread::spawn(|| println!("Thread 1"));
let t2 = thread::spawn(|| println!("Thread 2"));
t1.join().unwrap();
t2.join().unwrap();
println!("Done"); -> Option C
Quick Check:
Join all threads before final print to ensure order [OK]
Hint: Join all threads before final action to ensure completion [OK]
Common Mistakes:
Not joining threads before printing "Done"
Joining threads immediately after spawn (serializing)
Spawning extra thread for "Done" message
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.