Thank you all, here's the version I got to work: @@thr = ThreadGroup.new class MyThreadClass def wakeUp @@thr.list.each {|myThread| myThread.run } end end server = TCPServer.new('127.0.0.1',5190) while myThreads = Thread.new(session = server.accept) {|mySession| begin #if trigger value is met alarmClock = MyThreadClass.new alarmClock.wakeUp while mySession #biz logic code sleep 45 end ensure puts "leaving" mySession.close Thread.kill end } @@thr.add(myThreads) end