ThreadGroup
ThreadGroup (스레드 그룹)
ThreadGroup는 여러 스레드를 하나의 그룹으로 묶어서 추적하는 기능을 제공해요. 어떤 Thread 객체도 한 번에 하나의 ThreadGroup에만 속할 수 있어요. 새로운 그룹에 스레드를 추가하면 이전 그룹에서는 제거돼요.
출처: Ruby 3.3 API
본문
새로 생성된 스레드는 그 스레드를 만든 스레드와 같은 그룹에 속해요.
add(thread) → thgrp
주어진 스레드를 이 그룹에 추가해요. 스레드가 이전에 속해 있던 다른 그룹에서는 제거해요.
puts "Initial group is #{ThreadGroup::Default.list}"
tg = ThreadGroup.new
t1 = Thread.new { sleep }
t2 = Thread.new { sleep }
puts "t1 is #{t1}"
puts "t2 is #{t2}"
tg.add(t1)
puts "Initial group now #{ThreadGroup::Default.list}"
puts "tg group now #{tg.list}"
이 코드는 다음과 같은 결과를 보여줘요.
Initial group is [#<Thread:0x... run>, #<Thread:0x... run>]
t1 is #<Thread:0x... run>
t2 is #<Thread:0x... run>
Initial group now [#<Thread:0x... run>]
tg group now [#<Thread:0x... run>]
t1을 tg에 추가하면 기본 그룹(ThreadGroup::Default)에서는 빠지고 tg에 들어가는 걸 확인할 수 있어요.
enclose → thgrp
수신 ThreadGroup에 스레드를 추가하거나 제거하지 못하게 막아요. 다만 이미 닫힌 ThreadGroup 안에서 새 스레드를 시작하는 것은 여전히 가능해요.
ThreadGroup::Default.enclose #=> #<ThreadGroup:0x...>
thr = Thread.new { Thread.stop } #=> #<Thread:0x... run>
tg = ThreadGroup.new #=> #<ThreadGroup:0x...>
tg.add thr #=> ThreadError: can't move from the enclosed thread group
Default 그룹이 닫혀 있으므로, 그 그룹에 속한 thr을 다른 그룹 tg로 옮기려 하면 can't move from the enclosed thread group이라는 ThreadError가 발생해요.
enclosed? → true or false
thgrp가 닫혀 있는지(enclose 됐는지) true/false로 돌려줘요. ThreadGroup#enclose를 같이 보시면 돼요.
list → array
이 그룹에 속한 모든 존재하는 Thread 객체들의 배열을 돌려줘요.
ThreadGroup::Default.list #=> [#<Thread:0x... run>]