概要
Two-Phase Terminationパターン
詳細
スレッドの処理をメインの処理と終了処理に分けて
安全にスレッドを終了するパターンです。
このようにしっかりと終了処理を行って実行を終えることを
graceful(優雅な、上品な、礼儀正しい)と表現します。
注意点
・フラグによる終了制御とともにinterruptも使用しているのはsleep状態に対応するため
・重い処理を実行する場合は、処理前に終了判断のフラグをチェックすること。
構成
・TerminationRequester:終了要求を出す役
・Terminator:終了する役
サンプル
仕様
元請けが下請会社に仕事をさせます。
元請けは朝の6時から下請けに作業を開始させ、24時の終電の時間になると
渋々作業を終了させます。
下請けは黙々と働きつつもじわじわ衰弱していきます。
作業終了時には、明日も6時に出社するように洗脳をします。(安全な終了処理)
※この仕様はフィクションです
・TerminationRequester:元請け=PrimeContractor
・Terminator:下請け=Subcontractor
ソースコード
# encoding: utf-8 require "pp" require "thread" def random_sleep sleep ((rand 10) + 1) * 0.01 end class PrimeContractor def force_work (1..24).each do |t| puts "it's #{t} o'clock" case t when 1..5 puts "1時から5時は働かなくてもよい。なんという配慮。" random_sleep next when 6 puts "仕事開始!働け!" @subcontractor = Subcontractor.new random_sleep when 7..23 puts "まだまだ働け!" random_sleep when 24 puts "今日はこの辺で勘弁してやろう" @subcontractor.finish end end end end class Subcontractor def initialize @m = Mutex.new @is_finish = false work end def work @t = Thread.new do begin cnt = 1 loop do break if finish? print "\tゲホッ"*cnt puts "\n\tstill working..." sleep 0.05 cnt += 1 end ensure brainwashed end end end def finish @m.synchronize { @is_finish = true @t.interrupt unless @t.stop? } end def finish? @is_finish end def brainwashed puts "洗脳中・・・。労働は美徳、残業は美徳、ブツブツブツブツ" end end prime_contractor = PrimeContractor.new prime_contractor.force_work
実行結果例
it's 1 o'clock 1時から5時は働かなくてもよい。なんという配慮。 it's 2 o'clock 1時から5時は働かなくてもよい。なんという配慮。 it's 3 o'clock 1時から5時は働かなくてもよい。なんという配慮。 it's 4 o'clock 1時から5時は働かなくてもよい。なんという配慮。 it's 5 o'clock 1時から5時は働かなくてもよい。なんという配慮。 it's 6 o'clock 仕事開始!働け! ゲホッ still working... it's 7 o'clock まだまだ働け! ゲホッ ゲホッ still working... it's 8 o'clock まだまだ働け! it's 9 o'clock まだまだ働け! ゲホッ ゲホッ ゲホッ still working... it's 10 o'clock まだまだ働け! ゲホッ ゲホッ ゲホッ ゲホッ still working... it's 11 o'clock まだまだ働け! ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ still working... it's 12 o'clock まだまだ働け! ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ still working... ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ still working... it's 13 o'clock まだまだ働け! it's 14 o'clock まだまだ働け! ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ still working... ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ still working... it's 15 o'clock まだまだ働け! it's 16 o'clock まだまだ働け! ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ still working... it's 17 o'clock まだまだ働け! ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ still working... it's 18 o'clock まだまだ働け! ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ still working... ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ still working... it's 19 o'clock まだまだ働け! it's 20 o'clock まだまだ働け! ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ still working... it's 21 o'clock まだまだ働け! ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ still working... it's 22 o'clock まだまだ働け! ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ still working... ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ still working... it's 23 o'clock まだまだ働け! ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ still working... ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ ゲホッ still working... it's 24 o'clock 今日はこの辺で勘弁してやろう 洗脳中・・・。労働は美徳、残業は美徳、ブツブツブツブツ