2013-08-27 39 views
2

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

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

后,线程开始立即运行。我看到的所有代码都在线程体中使用全局变量。假设我们需要一个互斥锁,代码:

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

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

+0

可能重复[如何将监控对象传递给在Ruby中两个纱线对象?(http://stackoverflow.com/questions/18435630/how-to-pass-an-monitor-object-to -two-thread-objects-in-ruby)由同一个用户 –

回答

1

广义上说,你想达到什么目标?

您不需要在Ruby中继承Thread的子类。您传递给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 
+0

我只是想把我的C++思维转换成Ruby思维。狗样本完全解决了我的难题。谢谢。 – TieDad