Ruby操作数据时线程死亡

时间:2013-06-28 19:13:44

标签: ruby multithreading callback

我目前正在使用一个程序,该程序利用线程中的回调来操作静态类的类变量。当调用任何操纵对象的方法时,线程就会死掉。如果有人可以看一看并告诉我我做错了什么,或者我如何以更好的方式完成同样的事情,我将非常感激。下面是一个复制问题的简单程序。

在phone.rb中:

class Phone
  @@ringer = "RingVibrateRingVibrateRing"
  def self.get_ringer
    return @@ringer
  end

  def set_ringer(new_ring)
    @@ringer = new_ring
  end

  def self.calling_you(reached)
    puts "Calling you.  "
    t = Thread.new {
      sleep(3)
      reached.call
      Thread.exit
    }
    sleep(10)
    puts "Thanks for calling me back!"
  end
end

在CallTree.rb

require 'thread'
require 'C:\Users\mabauer\Desktop\phone.rb'


def calling_you_back
  ring_sound = Phone.get_ringer
  puts "#{ring_sound}"
  # The following line is where issues occur, when commented it works fine
  Phone.set_ringer("RingingRingingRinging")
  ring_sound = Phone.get_ringer
  puts "#{ring_sound}"
  puts "I called you back."
end

begin
  Phone.calling_you(method(:calling_you_back))
end

2 个答案:

答案 0 :(得分:0)

您正在调用Phone.set_ringer(...),但set_ringer被定义为实例方法。使它成为一个类方法(def self.set_ringer(...)),它将起作用。

答案 1 :(得分:0)

您应该在线程中设置一个异常处理程序,以便查看是否出现任何问题:

begin
  sleep(3)
  reached.call
  Thread.exit
rescue => err
  warn err
end

或者,当任何线程引发异常时,您可以使脚本中止回溯:

Thread.abort_on_exception = true

我看到的错误是set_ringer不是类方法。确保将其定义为self.set_ringer