Thread creation and execution in Ruby - Time & Space Complexity
When we create and run threads, we want to know how the time to finish changes as we add more threads.
We ask: How does running many threads affect the total time the program takes?
Analyze the time complexity of the following code snippet.
threads = []
10.times do |i|
threads << Thread.new do
sleep(1) # Simulate work
puts "Thread #{i} done"
end
end
threads.each(&:join)
This code creates 10 threads that each wait for 1 second, then print a message. The main program waits for all threads to finish.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Creating and running 10 threads that each sleep for 1 second.
- How many times: The thread creation loop runs 10 times, and each thread runs its code once.
Imagine increasing the number of threads (n) that each sleep for 1 second.
| Input Size (n) | Approx. Operations (seconds) |
|---|---|
| 10 | About 1 second total |
| 100 | About 1 second total |
| 1000 | About 1 second total |
Pattern observation: Because threads run at the same time, total time stays about the same even as we add more threads.
Time Complexity: O(1)
This means the total time to run all threads stays roughly the same no matter how many threads we create, assuming they run in parallel and the system can handle them concurrently.
[X] Wrong: "More threads always mean the program takes longer to finish."
[OK] Correct: Threads run at the same time, so adding more threads does not always increase total time if the system can handle them concurrently.
Understanding how threads affect time helps you explain how programs can do many things at once, a useful skill in real projects and interviews.
"What if each thread did a task that took longer than 1 second? How would the total time change then?"
Practice
Thread.new do in Ruby?Solution
Step 1: Understand the purpose of
Thread.newThread.newstarts a new thread that runs the code inside its block concurrently with the main program.Step 2: Compare options with the behavior
Only It creates a new thread to run code concurrently. correctly describes creating a new thread to run code at the same time as other threads.Final Answer:
It creates a new thread to run code concurrently. -> Option AQuick Check:
Thread.new= create thread [OK]
- Confusing thread creation with thread termination
- Thinking Thread.new pauses threads
- Assuming Thread.new modifies methods
Solution
Step 1: Recall correct thread creation syntax
The correct way isThread.new { ... }where the block contains the code to run.Step 2: Check each option
Thread.new { puts 'Hello from thread' } usesThread.newwith a block correctly. Options A, C, and D use invalid or non-existent methods or syntax.Final Answer:
Thread.new { puts 'Hello from thread' } -> Option DQuick Check:
UseThread.new { }for threads [OK]
- Using Thread.start without a block
- Mistyping method names like Thread.create
- Using Thread.run which does not exist
thread = Thread.new { 5.times { |i| puts i; sleep 0.1 } }
thread.join
puts 'Done'Solution
Step 1: Understand thread execution and join
The thread prints numbers 0 to 4 with a short pause. The main thread waits for it to finish because ofthread.join.Step 2: Determine output order
The numbers 0 to 4 print first, each on its own line, then after the thread finishes, 'Done' prints.Final Answer:
0 1 2 3 4 Done (each number on its own line) -> Option AQuick Check:
Thread prints numbers before main prints 'Done' [OK]
- Assuming 'Done' prints before numbers
- Thinking join blocks forever
- Ignoring sleep delays in thread
thread = Thread.new do puts 'Start' sleep 1 puts 'End' end puts 'Waiting' thread.join
Solution
Step 1: Check thread block syntax
The thread block is properly closed withend. Syntax is correct.Step 2: Verify thread execution and join
The main thread prints 'Waiting' then callsthread.jointo wait for the thread to finish. This is correct usage.Final Answer:
There is no error; the code runs correctly. -> Option CQuick Check:
Thread syntax and join usage are correct [OK]
- Thinking sleep is invalid in threads
- Assuming join is missing
- Miscounting block ends
Solution
Step 1: Create threads storing them in an array
threads = [] 3.times do |i| threads << Thread.new { puts i + 1 } end threads.each(&:join) puts 'Finished' correctly creates 3 threads, each printingi + 1(1, 2, 3), and stores them inthreads.Step 2: Wait for all threads to finish before printing 'Finished'
threads = [] 3.times do |i| threads << Thread.new { puts i + 1 } end threads.each(&:join) puts 'Finished' callsthreads.each(&:join)to wait for all threads, then prints 'Finished'. This ensures 'Finished' prints last.Final Answer:
threads = [] 3.times do |i| threads << Thread.new { puts i + 1 } end threads.each(&:join) puts 'Finished' -> Option BQuick Check:
Store threads, join all, then print [OK]
- Not storing threads to join later
- Printing 'Finished' before threads complete
- Using wrong thread index values
Ready to prove it?
Pass the test and this pattern moves unknown
