well... I'm not very experienced in this kind of things but i'm in a mood to learn... i tried your code multi-threaded and it DOES work (at least without errors or exceptions)... the thing is - your code features several calls to the OS - the echo and the ping commands ruby threads are (i think) ruby-internal so if ruby does a call to the OS, ruby can't act (let another thread do it's work) until it gets control back from the OS. so your original code really was multithreaded but it seemed linear for ruby threads are not really threads to the OS.... quote from the rubybook of the pragmaticprogrammers on this matter: > And if some thread happens to make > a call to the operating system that takes > a long time to complete, all threads will > hang until the interpreter gets control back. i modified your code (replaced the OS-calls) - and it IS multithreaded as you will see when you try it. the client.rb is the same as yours, also the exit.rb ------ #server.rb require 'drb' require 'timeout' STDOUT.sync = true class TstSrvr def initialize @work_threads = [] end def time_now "It is: " + Time.now.to_s end def work_request(owner = "", work_id = 0) return "Sorry, owner cannot be empty string" if owner == "" return "Sorry #{owner}, invalid work_id" if work_id < 1 ret = "Working on [" + work_id.to_s + "] from " + owner t = Thread.new { 100.times { |i| puts(work_id.to_s+": "+i.to_s) sleep(0.1) } } @work_threads = @work_threads << t ret end def check_work(owner = "", work_id = 0) # Stub for checking if the work is over end def bye(msg="") puts msg p @work_threads @work_threads.each { |t| t.join } Thread.new {sleep(0.1); exit(1)} nil end end srvObj = TstSrvr.new begin DRb.start_service("druby://localhost:5555",srvObj) DRb.thread.join rescue RuntimeError puts 'Got runtime error: ' puts $! DRb.stop_service retry end ----- end of code ------- regards, patrick --- using ruby 1.6.8 (pragmaticprogrammer installer 168-8) on winXPpro