2009-08-28 115 views
0

我在Ruby中有一个线程。它运行一个循环。当该循环达到睡眠(n)时,它停止并且不会醒来。如果我用睡眠(n)运行循环,它将作为无限循环运行。Ruby线程在线程中失败

代码中发生了什么以阻止线程按预期运行? 我该如何解决它?

class NewObject 
    def initialize 
     @a_local_var = 'somaText' 
    end 

    def my_funk(a_word) 
     t = Thread.new(a_word) do |args| 
      until false do 
       puts a_word 
       puts @a_local_var 
       sleep 5 #This invokes the Fail 
      end 
     end 
    end 
end 

if __FILE__ == $0 
    s = NewObject.new() 
    s.my_funk('theWord') 
    d = gets 
end 

我的平台是Windows XP SP3
我已经安装了红宝石的版本是1.8.6

+0

无法重现,上面的代码每5秒打印一次“theWord”和“somaText”。这是你所期望的吗?您遇到问题的任何特定版本的Ruby? – molf 2009-08-28 15:55:42

+0

我用ruby 1.8.6,1.9.1和jruby 1.3.1运行这段代码,它按预期工作。尝试添加Thread.abort_on_exception = true以查看您的错误是什么。 – ottobar 2009-08-28 15:56:41

回答

1

你缺少一个连接。

class NewObject 
    def initialize 
    @a_local_var = 'somaText' 
    end 

    def my_funk(a_word) 
    t = Thread.new(a_word) do |args| 
     until false do 
     puts a_word 
     puts @a_local_var 
     sleep 5 
     end 
    end 
    t.join # allow this thread to finish before finishing main thread 
    end 
end 

if __FILE__ == $0 
    s = NewObject.new() 
    s.my_funk('theWord') 
    d = gets # now we never get here 
end 
+0

那么,你说my_funk会完成,然后这会杀死线程var存在的范围,以便它会停止执行?原因与您的建议,它的作品。 – QueueHammer 2009-08-28 17:54:41