Tbpgr Blog

Recruiting Operations tbpgr(てぃーびー) のブログ

マルチスレッドデザインパターン | Two-Phase Terminationパターン 〜 とあるブラック企業と社畜

概要

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
今日はこの辺で勘弁してやろう
洗脳中・・・。労働は美徳、残業は美徳、ブツブツブツブツ