トップ «前の日記(2014-02-25) 最新 次の日記(2014-02-27)» 編集

ヨタの日々

2001|08|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|12|
2024|01|02|03|04|

2014-02-26 :-(

_ 午前

0530 起床

0710 食堂

0830 出勤 || デバッグしTARI

_ 午後

1300 デバッグしTARI

_

1700 退勤

1730 仕事場のプール && 冬になってから行ってなかった && 片道 25m 泳ぐだけで息が切れるというか心臓がバクバクいうんだけど

1900 ウェブ巡回

2000 飯

2100 はてなブックマークがどうのこうの

_ [Java][Ruby][マルチスレッド][デザインパターン]Java言語で学ぶデザインパターン入門マルチスレッド編 Future - 引換券を、お先にどうぞ

先に発注だけおこないあとで成果物を受け取る。

# coding: utf-8

#
# 『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』 http://www.hyuki.com/dp/dp2.html
# 
# Future - 引換券を、お先にどうぞ
#

require 'thread'
require 'monitor'

class BData
  def getContent()
  end
end

class RealData < BData
  def initialize(count, c)
    @content = ""
    puts "        making RealData(#{count}, #{c}) BEGIN"
    buffer = Array.new(count)
    0.upto(count - 1) {|i|
      buffer[i] = c
      begin
        sleep(0.1)
      rescue => ex
        puts ex
      end
    }
    puts "        making RealData(#{count}, #{c}) END"
    @content = buffer.join()
  end
  
  def getContent()
    return @content
  end
end

class FutureData < BData
  def initialize()
    @lock = Monitor.new
    @cond = @lock.new_cond()
    @realdata = nil
    @ready = false
  end

  def setRealData(realdata)
    @lock.synchronize() {
      if @ready
        return  # balk
      end
      @realdata = realdata
      @ready = true
      @cond.broadcast()
    }
  end
  
  def getContent()
    @lock.synchronize() {
      while @ready == false
        begin
          @cond.wait()
        rescue => ex
          puts ex
        end
      end
      return @realdata.getContent()
    }
  end
end

class Host
  def initialize()
  end
  
  def request(count, c)
    puts "    request(#{count}, #{c}) BEGIN"

    # (1) FutureDataのインスタンスを作る
    future = FutureData.new()

    # (2) RealDataを作るための新しいスレッドを起動する
    t = Thread.new() {
      realdata = RealData.new(count, c)
      future.setRealData(realdata)
    }
    
    # join() するとここでブロックするのでやってはいけない
#    t.join()

    puts "    request(#{count}, #{c}) END"

    # (3) FutureDataのインスタンスを戻り値とする
    return future;
  end
end

def main(argv)
  puts "main BEGIN"
  host = Host.new()
  data1 = host.request(10, 'A')
  data2 = host.request(20, 'B')
  data3 = host.request(30, 'C')

  puts "main otherJob BEGIN"
  begin
    sleep(2)
  rescue => ex
    puts ex
  end
  puts "main otherJob END"

  puts "data1 = #{data1.getContent()}"
  puts "data2 = #{data2.getContent()}"
  puts "data3 = #{data3.getContent()}"
  puts "main END"
end

main(ARGV)
>ruby Future.rb
main BEGIN
    request(10, A) BEGIN
    request(10, A) END
    request(20, B) BEGIN
    request(20, B) END
    request(30, C) BEGIN
    request(30, C) END
main otherJob BEGIN
        making RealData(10, A) BEGIN
        making RealData(20, B) BEGIN
        making RealData(30, C) BEGIN
        making RealData(10, A) END
        making RealData(20, B) END
main otherJob END
data1 = AAAAAAAAAA
data2 = BBBBBBBBBBBBBBBBBBBB
        making RealData(30, C) END
data3 = CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
main END

ライセンス

Copyright (C) 2002,2006 Hiroshi Yuki.
http://www.hyuki.com/dp/dp2.html
hyuki@hyuki.com

This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions:

1. The origin of this software must not be misrepresented; you must not claim
that you wrote the original software. If you use this software in a product,
an acknowledgment in the product documentation would be appreciated but is not
required.

2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.

3. This notice may not be removed or altered from any source distribution.

参考

『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』

4797331623