Rubyで結城浩せんせいのJavaマルチスレッド本 その12 #Two-Phase termination
仕事中のスレッドを止める
スレッドに例外を通知する。
フラグ | waitしてるかも |
例外 | どこでキャッチしてるか分からない |
2段階の終了
- 終了リクエスト受付
- 安全性を考慮して終了
rubyでかいてみた
#!/usr/bin/env ruby #Two-Phase Termination class CountupThread def initialize @counter = 0 @shutdown_requested = false end def start block=Proc.new{ begin while (!@shutdown_requested) do self.do_work() end rescue ensure self.do_shutdown end } @t=Thread.new(&block) end def shutdown_request @shutdown_requested = true # while条件チェックまでに時間が掛るかも? @t.raise "interrupt!!" # 例外を投げる end def do_work @counter = @counter + 1 sleep 500.to_f/1000 puts " do_work : counter = #{@counter} " end def do_shutdown puts " do_shutdown : counter = #{@counter}" end end ct = CountupThread.new() t=ct.start #t.pass puts "main BEGIN" #少し時間を空ける sleep 5 ct.shutdown_request puts "main shutdown_request" puts "main END" t.join
終了するには、フラグと例外。