What if your program could do many things at once, just like having many hands helping you?
Why Thread creation and execution in Ruby? - Purpose & Use Cases
Imagine you have to bake 10 cakes, but you only have one oven and one tray. You bake one cake at a time, waiting for each to finish before starting the next.
This slow, one-by-one baking means you waste a lot of time waiting. If you try to do many tasks in a row without help, your program also waits and wastes time doing nothing.
Thread creation lets your program start many tasks at once, like having multiple ovens baking cakes simultaneously. This way, your program works faster and uses time better.
10.times { |i| puts "Baking cake #{i+1}"; sleep(2) }
threads = 10.times.map { |i| Thread.new { puts "Baking cake #{i+1}"; sleep(2) } }; threads.each(&:join)
Threads let your program do many things at the same time, making it faster and more efficient.
When a website loads images, text, and videos all at once instead of waiting for each to finish, it feels faster and smoother to use.
Doing tasks one after another wastes time.
Threads let multiple tasks run together.
This makes programs faster and more responsive.
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
