RubyのThreadのステータスに関して
class Thread (Ruby 2.4.0)
instance method Thread#status (Ruby 2.4.0)
instance method Thread#alive? (Ruby 2.4.0)
Rubyのスレッドに関して各ケースのステータスまとめ
各項目がとる値
- thread object(thread.inspect)
- run
- sleep
- aborting
- dead
- thread.status
- run
- sleep
- false
- nil
- thread.alive?
- true
- false
調査
通常時(スレッドが生きているとき)
ソース
t1 = Thread.start{ loop do sleep 1 end } loop do p t1 # run, sleep, aborting, dead puts t1.status || t1.status.class # run, sleep, false, nil puts t1.alive? # true, false puts "--------------------------------" sleep 1 end
実行結果
#<Thread:0x55e80d30 sleep> run true -------------------------------- #<Thread:0x55e80d30 sleep> run true -------------------------------- #<Thread:0x55e80d30 sleep> run true --------------------------------
各ステータス
- thread object : (run), sleep
- thread.status : run, (sleep)
- thread.alive? : true
正常終了時
ソース
t1 = Thread.start{ 2.times{|n| sleep 1 puts n+1 } } loop do p t1 puts t1.status || t1.status.class # run, sleep, aborting, false, nil puts t1.alive? # true, false puts "--------------------------------" sleep 1 end
実行結果
#<Thread:0x566a0c48 run> sleep true -------------------------------- 1 #<Thread:0x566a0c48 sleep> sleep true -------------------------------- 2 #<Thread:0x566a0c48 dead> FalseClass false -------------------------------- #<Thread:0x566a0c48 dead> FalseClass false -------------------------------- #<Thread:0x566a0c48 dead> FalseClass false --------------------------------
各ステータス
- thread object : dead
- thread.status : false
- thread.alive? : false
異常終了時
ソース
t1 = Thread.start{ 2.times{|n| sleep 1 puts n+1 } raise } loop do p t1 puts t1.status || t1.status.class # run, sleep, aborting, false, nil puts t1.alive? # true, false puts "--------------------------------" sleep 1 end
実行結果
#<Thread:0x558e8bf0 run> sleep true -------------------------------- #<Thread:0x558e8bf0 run> sleep 1 true -------------------------------- #<Thread:0x558e8bf0 run> 2 sleep false -------------------------------- #<Thread:0x558e8bf0 dead> NilClass false -------------------------------- #<Thread:0x558e8bf0 dead> NilClass false
各ステータス
- thread object : dead
- thread.status : nil
- thread.alive? : false
まとめると
- thread.statusはスレッドが生きている間はrunかsleepで、正常終了するとfalseになり、異常終了するとnilになる
- thread.alive?はスレッドが生きている間はtrueで、終了すると正常・異常に関わらずfalseになる
- thread情報を直接見ると、スレッドが生きている場合はrunかsleepで、終了処理中はabortingになり、完全に終了するとdeadになる