2

在 C/C++ 中,当我们创建一个线程时,有一种机制可以将一些参数传递给线程执行体。在java中,我们可以子类化Thread该类以允许线程类包含一些实例变量。在 Ruby 中,创建线程的方法是:

thread = Thread.new {
   ... code thread execution body
}

之后Thread.new,线程立即开始运行。我见过的所有代码都在线程主体中使用全局变量。假设我们需要一个互斥锁,代码是:

mutex = Mutex.new
thread = Thread.new {
   ... code thread execution body
   mutex.synchronized {
     ... some code
   }
}

是否可以创建一个子类Thread并允许它具有一些实例变量?我无法弄清楚的技术问题是如何将代码块传递给子类以及子类如何将代码块传递给超Thread类。

4

1 回答 1

1

从广义上讲,您要实现什么目标?

您不需要Thread在 Ruby 中进行子类化。您传递给的代码块Thread.new将简单地在调用的代码的上下文中执行Thread.new,并且可以访问调用方法的局部变量和调用类实例的实例变量。

class Dog
  def initialize(name)
    @name = name
  end
  def start_barking
    Thread.new do
      10.times do
        puts "Woof! Woof! #{@name}!"
      end
    end
  end
end

如果您正在寻找线程局部变量,您可以使用Thread.current特殊哈希。

10.times do |i|
  Thread.new do
    Thread.current[:i] = i
    sleep 1
    puts Thread.current[:i]
  end
end
于 2013-08-27T01:43:50.687 回答