2013-08-27 44 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