それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Rubyでマルチスレッド 12 #two-phase termination

Ruby結城浩せんせいのJavaマルチスレッド本 その12 #Two-Phase termination

仕事中のスレッドを止める

スレッドに例外を通知する。

フラグ waitしてるかも
例外 どこでキャッチしてるか分からない

2段階の終了

  1. 終了リクエスト受付
  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

終了するには、フラグと例外。