6. def self.thread_main(idx)
loop do
# スレッド処理
end
end
def self.main(argv)
th_infos = Hash.new
for i in 0…100
th_infos[i] = Thread.new(i){|idx| thread_main(idx)}
end
check_threads(th_infos)
end
7. def self.check_threads(th_infos)
loop do
th_infos.each do |i, th|
f_restart = false
case th.status
when “run”, “sleep”
else
f_restart = true
end
if f_restart
th.kill
th.join
th_infos[i] =
Thread.new(i) {|idx| thread_main(idx)}
end
end
sleep 1
end
end
13. class ThreadWatch
def initialize(timer)
@update_time = nil
@alive_timer = timer
@mutex = Mutex.new
end
def update
@mutex.synchronize do
@update_time = Time.now
end
end
def valid?
@mutex.synchronize do
return false if !@update_time.nil? &&
(Time.now - @update_time) > @alive_timer)
end
true
end
end
14. def self.thread_main(idx, watch)
loop do
watch.update
# スレッド処理
end
end
def self.main(argv)
th_infos = Hash.new
for i in 0…100
w = ThreadWatch.new(600)
th = Thread.new(i, w) do |idx, watch|
thread_main(idx, watch)
end
th_infos[i] = [th, w]
end
check_threads(th_infos)
end
15. def self.check_threads(th_infos)
loop do
th_infos.each do |i, info|
th, w = info
f_restart = false
case th.status
when “run”, “sleep”
f_restart = true unless w.valid?
else
f_restart = true
end
if f_restart
th.kill
th.join
th = Thread.new(i, w) do |idx, watch|
thread_main(idx, watch)
end
th_infos[i] = [th, w]
end
end
20. describe OedoThread, “thread_main” do
class OedoThread
@@counter = 0
def self.run?
@@counter += 1
return false if @@counter > 3
true
end
end
it “call 3 times” do
m_watch = mock(“thread watch”)
m_watch.should_receive(:update).exactly(3)
OedoThread.thread_main(1, m_watch)
end
end