Bird
Raised Fist0
Rubyprogramming~5 mins

Thread creation and execution in Ruby - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Thread creation and execution
O(1)
Understanding Time 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?

Scenario Under Consideration

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 Repeating Operations

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.
How Execution Grows With Input

Imagine increasing the number of threads (n) that each sleep for 1 second.

Input Size (n)Approx. Operations (seconds)
10About 1 second total
100About 1 second total
1000About 1 second total

Pattern observation: Because threads run at the same time, total time stays about the same even as we add more threads.

Final Time Complexity

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.

Common Mistake

[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.

Interview Connect

Understanding how threads affect time helps you explain how programs can do many things at once, a useful skill in real projects and interviews.

Self-Check

"What if each thread did a task that took longer than 1 second? How would the total time change then?"

Practice

(1/5)
1. What does Thread.new do in Ruby?
easy
A. It creates a new thread to run code concurrently.
B. It pauses the current thread until another finishes.
C. It terminates all running threads immediately.
D. It converts a method into a thread-safe version.

Solution

  1. Step 1: Understand the purpose of Thread.new

    Thread.new starts a new thread that runs the code inside its block concurrently with the main program.
  2. 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.
  3. Final Answer:

    It creates a new thread to run code concurrently. -> Option A
  4. Quick Check:

    Thread.new = create thread [OK]
Hint: Remember: Thread.new starts a new thread block [OK]
Common Mistakes:
  • Confusing thread creation with thread termination
  • Thinking Thread.new pauses threads
  • Assuming Thread.new modifies methods
2. Which of the following is the correct syntax to create and start a thread in Ruby?
easy
A. Thread.start puts 'Hello from thread'
B. Thread.run { puts 'Hello from thread' }
C. Thread.create do puts 'Hello from thread' end
D. Thread.new { puts 'Hello from thread' }

Solution

  1. Step 1: Recall correct thread creation syntax

    The correct way is Thread.new { ... } where the block contains the code to run.
  2. Step 2: Check each option

    Thread.new { puts 'Hello from thread' } uses Thread.new with a block correctly. Options A, C, and D use invalid or non-existent methods or syntax.
  3. Final Answer:

    Thread.new { puts 'Hello from thread' } -> Option D
  4. Quick Check:

    Use Thread.new { } for threads [OK]
Hint: Use Thread.new with a block to start threads [OK]
Common Mistakes:
  • Using Thread.start without a block
  • Mistyping method names like Thread.create
  • Using Thread.run which does not exist
3. What will be the output of this Ruby code?
thread = Thread.new { 5.times { |i| puts i; sleep 0.1 } }
thread.join
puts 'Done'
medium
A. 0 1 2 3 4 Done (each number on its own line)
B. Done 0 1 2 3 4 (each number on its own line)
C. Only 'Done' is printed
D. No output because thread.join blocks forever

Solution

  1. 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 of thread.join.
  2. Step 2: Determine output order

    The numbers 0 to 4 print first, each on its own line, then after the thread finishes, 'Done' prints.
  3. Final Answer:

    0 1 2 3 4 Done (each number on its own line) -> Option A
  4. Quick Check:

    Thread prints numbers before main prints 'Done' [OK]
Hint: join waits for thread to finish before continuing [OK]
Common Mistakes:
  • Assuming 'Done' prints before numbers
  • Thinking join blocks forever
  • Ignoring sleep delays in thread
4. Identify the error in this Ruby code snippet:
thread = Thread.new do
  puts 'Start'
  sleep 1
  puts 'End'
end
puts 'Waiting'
thread.join
medium
A. The thread block is missing a closing end.
B. The main thread does not wait for the new thread to finish.
C. There is no error; the code runs correctly.
D. The sleep method cannot be used inside a thread.

Solution

  1. Step 1: Check thread block syntax

    The thread block is properly closed with end. Syntax is correct.
  2. Step 2: Verify thread execution and join

    The main thread prints 'Waiting' then calls thread.join to wait for the thread to finish. This is correct usage.
  3. Final Answer:

    There is no error; the code runs correctly. -> Option C
  4. Quick Check:

    Thread syntax and join usage are correct [OK]
Hint: Check block ends and join usage carefully [OK]
Common Mistakes:
  • Thinking sleep is invalid in threads
  • Assuming join is missing
  • Miscounting block ends
5. You want to create 3 threads that each print their thread number (1, 2, 3) and then print 'Finished' after all threads complete. Which code correctly achieves this?
hard
A. 3.times do |i| Thread.new { puts i + 1 } end puts 'Finished'
B. threads = [] 3.times do |i| threads << Thread.new { puts i + 1 } end threads.each(&:join) puts 'Finished'
C. threads = [] 3.times do |i| threads << Thread.new { puts i } end puts 'Finished' threads.each(&:join)
D. threads = [] 3.times do |i| threads << Thread.new { puts i + 1 } end puts 'Finished' threads.each(&:join)

Solution

  1. 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 printing i + 1 (1, 2, 3), and stores them in threads.
  2. 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' calls threads.each(&:join) to wait for all threads, then prints 'Finished'. This ensures 'Finished' prints last.
  3. Final Answer:

    threads = [] 3.times do |i| threads << Thread.new { puts i + 1 } end threads.each(&:join) puts 'Finished' -> Option B
  4. Quick Check:

    Store threads, join all, then print [OK]
Hint: Join all threads before printing final message [OK]
Common Mistakes:
  • Not storing threads to join later
  • Printing 'Finished' before threads complete
  • Using wrong thread index values
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard