大量の応答待ちをしたい時とかに有利なのよねスレッド。
でも無条件にバカバカ作るとリソース食べつくしちゃう。制限かけなくちゃね。
さっすが、わすりやすいわね。
これを参考にサンプルを書いてみたの。テーマは「 たくさんスレッドあるけど、同時に動かすのは二つよ? 」ね。
aa = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" names = aa.split("") threads = [] locks = Queue.new 2.times{locks.push(:lock)} names.each do |name| threads << Thread.new do lock = locks.pop 7.times do |i| print "#{name}:#{i}\n" sleep rand(3) end locks.push lock end end threads.each { |t| t.join } puts "\nall threds are terminated."
……でやってたんだけど、ダメみたいね。
いえ、普通はいいんだけど、スレッド総数が膨れ上がるとエラーになってしまうのよね orz
というわけで、やりなおし。
locks = Queue.new 2.times { locks.push :lock } (1..99).map{|i| Thread.new{ lock = locks.pop print "#{i} START\n" sleep rand(1..8) print "#{i} END\n" locks.push lock } }.each{|t|t.join}
わかりやすく、最もシンプルにしてみたけど、どうかしら。
キモは、配列.map ね。
これでちょっと様子を見てみましょう。