2012-09-27 51 views
1

隨着的Ruby 1.8.7我試圖擴展這裏Thread類的片斷擴展Thread類

class Foo < Thread 
    attr_accessor :bar 
end 

t = Foo.new do 
    puts "Foo thread begins" 
    self.bar = "Bar value" # also tried @bar 
    sleep(2) 
    puts "Foo thread ends" 
end 

puts "Value: #{t.bar}" 
sleep(10) 
puts "Value: #{t.bar}" 

輸出是

>Foo thread begins 
>Value: 
>Foo thread ends 
>Value: 

爲什麼我不能看到:bar屬性爲Foo類?由於這可能不是以這種方式工作的,我如何將新創建的Thread的值傳遞給main線程?

謝謝

回答

2

self在你的線程是指主要對象,不t。由於方法bar=未在主對象上定義,因此會引發錯誤,該錯誤不會發送到主線程。

有幾種方法可以訪問該線程:

1)Foo.new{p Foo.current}

2)Foo.new{|foo| p foo}

3)foo = Foo.new{p foo}

+0

我該如何訪問它然後,我該如何設置我的線程的'bar'變量? –

+0

非常感謝您,這可能不是編寫線程安全程序但仍在學習的最佳方式。再次感謝。 –

+0

我非常確定'3)'不會工作(至少它不符合1.8.7),因爲foo在線程正文執行時未被評估。所以你在那裏得到'nil',當試圖設置屬性時會引發異常。 –

1

你並不需要延長線,你可以嘗試下面的代碼。

class Foo 
    attr_accessor :bar 

    def run 
    Thread.new do 
     puts "Foo thread begins" 
     self.bar = "Bar value" # also tried @bar 
     sleep(2) 
     puts "Foo thread ends" 
    end 
    end 
end 

t = Foo.new 
t.run 

puts "Value: #{t.bar}" 
sleep(10) 
puts "Value: #{t.bar}" 
+0

謝謝,好方法。 –