2011-01-30 50 views
2
Class A 
    def foo 
    do s.t 
    end 
end 

class B 
    def initialize 
    @bar = Thread::new{ 
     A::new 
    } 
    #Here I want to call A.foo in the thread @bar 
    end 
end 

bar = B::new 

我想用类A启动一个新线程。如何从类B调用方法foo?调用线程中的类的方法

回答

3

我认为你对你的问题感到困惑。首先,你说

我要开始一个新的线程与A级

,但你的意思是什么,目前尚不清楚。你不能用一个班级开始一个线程。其次,你说

在这里,我想打电话给A.foo在线程@bar

,但你不是说正在新线程在这一点上执行的程序段内。即使你是,也没有A级的分类方法'foo',所以A.foo只会产生一个NoMethodError。那么你说你想

从类B调用foo方法?

即使有关调用foo的评论是在实例B.

所以,我假设你的意思如下:

Class A 
    def foo 
    end 
end 

class B 
    def initialize 
    @bar = Thread::new{ 
     a = A::new 
    } 
    # Here I want to call a.foo 
    end 
end 
bar = B::new 

现在,在这种情况下,您的问题是您创建的A的新实例对于线程@bar执行的块而言是本地的。它不是您创建的Thread实例的实例变量,您无法访问该实例的任何方法。然而,你可以做的是事先创建该实例并与线程共享:

class B 
    def initialize 
    a = A.new 
    @bar = Thread::new { 
     do_stuff_with a 
    } 
    a.foo 
    end 

这将工作得很好。当然,你遇到并发地狱和所有与使用线程相关的问题。谨防。