Thread必然归属于某一个线程组. 可以使用ThreadGroup类来统一管理该线程组内的Thread.
默认的ThreadGroup是ThreadGroup::Default. 新生成的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"
若对象Thread可能会唤醒Thread时(请参考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 特性>))
禁止向ThreadGroup中添加/删除Thread(但不会进行冻结).
(若添加/删除的话,则会引发((<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 特性>))以布尔值的形式返回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是一样的).
Default默认的ThreadGroup. 主线程最初就属于该线程组.