在线文档教程
Ruby 2.4

ThreadsWait

class ThreadsWait

Parent:Object

这个类监视多线程的终止。基本功能(等待指定线程终止)可以通过class method::all_waits来访问。使用实例方法可以获得更好的控制。

例:

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

属性

threadsR

返回尚未终止的线程数组。

Public Class Methods

all_waits(*threads) { |thread| ... } Show source

等待所有指定的线程终止。如果提供了一个块,它将在每个线程终止时执行。

# File lib/thwait.rb, line 36 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

new(*threads) Show source

创建一个ThreadsWait对象,指定要等待的线程。非阻塞。

# File lib/thwait.rb, line 51 def initialize(*threads) @threads = [] @wait_queue = Thread::Queue.new join_nowait(*threads) unless threads.empty? end

Public Instance Methods

all_waits() { |th| ... } Show source

等待所有指定的线程终止。如果为该方法提供了一个块,则会为每个线程终止执行该块。

以与next_wait。相同的方式引发异常。

# File lib/thwait.rb, line 124 def all_waits until @threads.empty? th = next_wait yield th if block_given? end end

empty?() Show source

返回true如果没有线程池中仍在运行。

# File lib/thwait.rb, line 63 def empty? @threads.empty? end

finished?() Show source

如果任何线程已终止并准备收集,则返回true

# File lib/thwait.rb, line 70 def finished? !@wait_queue.empty? end

join(*threads) Show source

等待指定的线程终止,并在其中一个线程终止时返回。

# File lib/thwait.rb, line 78 def join(*threads) join_nowait(*threads) next_wait end

join_nowait(*threads) Show source

指定此对象将等待的线程,但实际上并未等待。

# File lib/thwait.rb, line 87 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) Show source

等待任何指定的线程终止,然后返回执行的线程。

如果没有线程可以等待,则引发ErrNoWaitingThread。如果nonblock为真,并且没有终止的线程,则引发ErrNoFinishedThread

# File lib/thwait.rb, line 108 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