Class: ThreadsWait
- Inherits:
-
Object
- Object
- ThreadsWait
- Extended by:
- Exception2MessageMapper
- Defined in:
- lib/thwait.rb
Overview
This class watches for termination of multiple threads. Basic functionality (wait until specified threads have terminated) can be accessed through the class method ThreadsWait::all_waits. Finer control can be gained using instance methods.
Example:
ThreadsWait.all_waits(thr1, thr2, ...) do |t|
STDERR.puts "Thread #{t} has terminated."
end
th = ThreadsWait.new(thread1,...)
th.next_wait # next one to be done
Instance Attribute Summary collapse
-
#threads ⇒ Object
readonly
Returns the array of threads that have not terminated yet.
Class Method Summary collapse
-
.all_waits(*threads) ⇒ Object
Waits until all specified threads have terminated.
Instance Method Summary collapse
-
#all_waits ⇒ Object
Waits until all of the specified threads are terminated.
-
#empty? ⇒ Boolean
Returns
true
if there are no threads in the pool still running. -
#finished? ⇒ Boolean
Returns
true
if any thread has terminated and is ready to be collected. -
#initialize(*threads) ⇒ ThreadsWait
constructor
Creates a ThreadsWait object, specifying the threads to wait on.
-
#join(*threads) ⇒ Object
Waits for specified threads to terminate, and returns when one of the threads terminated.
-
#join_nowait(*threads) ⇒ Object
Specifies the threads that this object will wait for, but does not actually wait.
-
#next_wait(nonblock = nil) ⇒ Object
Waits until any of the specified threads has terminated, and returns the one that does.
Constructor Details
#initialize(*threads) ⇒ ThreadsWait
Creates a ThreadsWait object, specifying the threads to wait on. Non-blocking.
52 53 54 55 56 |
# File 'lib/thwait.rb', line 52 def initialize(*threads) @threads = [] @wait_queue = Queue.new join_nowait(*threads) unless threads.empty? end |
Instance Attribute Details
#threads ⇒ Object (readonly)
Returns the array of threads that have not terminated yet.
59 60 61 |
# File 'lib/thwait.rb', line 59 def threads @threads end |
Class Method Details
.all_waits(*threads) ⇒ Object
Waits until all specified threads have terminated. If a block is provided, it is executed for each thread as they terminate.
37 38 39 40 41 42 43 44 45 46 |
# File 'lib/thwait.rb', line 37 def ThreadsWait.all_waits(*threads) # :yield: thread tw = ThreadsWait.new(*threads) if block_given? tw.all_waits do |th| yield th end else tw.all_waits end end |
Instance Method Details
#all_waits ⇒ Object
Waits until all of the specified threads are terminated. If a block is supplied for the method, it is executed for each thread termination.
Raises exceptions in the same manner as next_wait
.
125 126 127 128 129 130 |
# File 'lib/thwait.rb', line 125 def all_waits until @threads.empty? th = next_wait yield th if block_given? end end |
#empty? ⇒ Boolean
Returns true
if there are no threads in the pool still running.
64 65 66 |
# File 'lib/thwait.rb', line 64 def empty? @threads.empty? end |
#finished? ⇒ Boolean
Returns true
if any thread has terminated and is ready to be collected.
71 72 73 |
# File 'lib/thwait.rb', line 71 def finished? !@wait_queue.empty? end |
#join(*threads) ⇒ Object
Waits for specified threads to terminate, and returns when one of the threads terminated.
79 80 81 82 |
# File 'lib/thwait.rb', line 79 def join(*threads) join_nowait(*threads) next_wait end |
#join_nowait(*threads) ⇒ Object
Specifies the threads that this object will wait for, but does not actually wait.
88 89 90 91 92 93 94 95 96 97 98 99 100 |
# File 'lib/thwait.rb', line 88 def join_nowait(*threads) threads.flatten! @threads.concat threads for th in threads Thread.start(th) do |t| begin t.join ensure @wait_queue.push t end end end end |
#next_wait(nonblock = nil) ⇒ Object
Waits until any of the specified threads has terminated, and returns the one that does.
If there is no thread to wait, raises ErrNoWaitingThread
. If nonblock
is true, and there is no terminated thread, raises ErrNoFinishedThread
.
109 110 111 112 113 114 115 116 117 |
# File 'lib/thwait.rb', line 109 def next_wait(nonblock = nil) ThreadsWait.fail ErrNoWaitingThread if @threads.empty? begin @threads.delete(th = @wait_queue.pop(nonblock)) th rescue ThreadError ThreadsWait.fail ErrNoFinishedThread end end |