ThreadGroup

Thread はグループを持ち、必ずいずれかのグループに属します。 ThreadGroup クラスによりグループに属する Thread をまとめて 操作することができます。

デフォルトの ThreadGroup は、 ThreadGroup::Default です。生成されたばかり の Thread は生成した Thread のグループを引き継ぎます。

:

生成したすべてのThreadが終了するのを待つ

5.times {
   Thread.new { sleep 1; puts "#{Thread.current} finished" }
}

(ThreadGroup::Default.list - [Thread.current]).each {|th| th.join}

puts "all threads finished"

対象の ThreadThread を起こす可能性がある場合 (Thread.exclusive参照)

Thread.exclusive do
  (ThreadGroup::Default.list - [Thread.current]).each {|th| th.join}
end

スーパークラス:

クラスメソッド:

ThreadGroup.new

新たな ThreadGroup を生成して返します。

メソッド:

add(thread)

スレッド thread のグループを self にします。

self を返します。

enclose ((<ruby 1.8 feature>))
ThreadGroup への Thread の追加/削除を(freeze せずに)禁止します。
(追加/削除を行うと例外 ((<ThreadError>)) が発生します)

self を返します。

追加の例:

      thg = ThreadGroup.new.enclose
      thg.add Thread.new {}

      => -:2:in `add': can't move to the enclosed thread group (ThreadError)

削除の例:

      thg1 = ThreadGroup.new
      thg2 = ThreadGroup.new

      th = Thread.new {sleep 1}

      thg1.add th
      thg1.enclose
      thg2.add th

      => -:8:in `add': can't move from the enclosed thread group (ThreadError)
enclosed? ((<ruby 1.8 feature>))

enclose の状態を真偽値で返します。 freeze された ThreadGroup に Thread の追加/削除はできなくなりますが、 enclosed? は false を返します。

thg = ThreadGroup.new
p thg.enclosed?         # => false
thg.enclose
p thg.enclosed?         # => true

thg = ThreadGroup.new
p thg.enclosed?         # => false
thg.freeze
p thg.enclosed?         # => false
list

self に属するスレッドの配列を返します。

終了処理中(aborting)、や終了状態(dead)であるスレッドは要素に含まれ ません(Thread.listと同じです)。 *1

定数:

Default

デフォルトで定義されている ThreadGroup です。メインスレッド は最初このグループに属します。


*1ruby 1.7 feature: version 1.7 では、aborting 状態であるスレッド も要素に含まれます。つまり「生きている」スレッドの配列を返します



rubyist ML