スレッドグループ。一括操作できる。
成果物
情報源
ThreadGroup
スレッドグループを表すクラスです。グループに属する Thread をまとめて操作することができます。
Thread は必ずいずれかひとつのスレッドグループに属します。生成されたばかりの Thread は、生成した Thread のグループを引き継ぎます。メインスレッドはデフォルトでは ThreadGroup::Default に属します。
例: 生成したすべての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#freeze と ThreadGroup#enclose の違い
どちらのメソッドでも ThreadGroup#add によるスレッドの追加ができなくなる点は同じですが、 Thread.new に関して違いがあります。現在のスレッドが属する ThreadGroup が freeze されている場合、Thread.new{ ... } はエラーになります。ThreadGroup が enclose されているだけでは、 Thread.new{ ... } はエラーになりません。生成されたスレッドは従来通り 親スレッドの ThreadGroup に属します。
なぜThreadGroup.freezeはThreadGroupクラスのメソッドなのにThreadクラスのメソッドnew
でエラー発生するようにできてしまうの? そもそもそれらをエラー発生するようにする必要性もよくわからない。なんかマズイことあるの?
メンバ抜粋
特異メソッド
new
インスタンスメソッド
add enclose enclosed? list
定数
Default
new
thread_group = ThreadGroup.new thread_group.add Thread.new { sleep 0.1; Thread.new { sleep 1 }; sleep 1 } thread_group.add Thread.new { sleep 2 } sleep 0.5 thread_group.list # => [#<Thread:0x007fc6f1842d70 sleep>, #<Thread:0x007fc6f1842c80 sleep>, #<Thread:0x007fc6f080dba8 sleep>]
所感
add
とlist
しかないのかよ。delete
もなければstart
やstop
もない。ただ入れ物に追加するだけの存在。配列じゃダメだったの?
対象環境
- Raspbierry pi 4 Model B
- Raspberry Pi OS buster 10.0 2020-08-20 ※
- bash 5.0.3(1)-release
- Ruby 3.0.2
$ uname -a Linux raspberrypi 5.10.52-v7l+ #1441 SMP Tue Aug 3 18:11:56 BST 2021 armv7l GNU/Linux