2012-06-11 22 views
6

我有一个问题。如果我有一个方法为DoSomething()的对象,如果为此方法创建多个线程,它是否可以工作,并且它将作为它自己的单独线程运行,是否可能并且有效?在对象的实例上为同一方法创建多个线程

E.g.

public class SomeClass 
{ 
    public void DoSomething() 
    { 
     //somethings done here 
    } 
} 

public class MainProgram 
{ 
    public MainProgram() 
    { 
     InitializeComponents(); 
    } 

    protected override OnStart(string[] args) 
    { 
     SomeClass sc = new SomeClass(); 
     Thread workerOne = new Thread(() => sc.DoSomething()); 
     workerOne.Start(); 

     Thread workerTwo = new Thread(() => sc.DoSomething()); 
     workerTwo.Start(); //start a new thread calling same method 
    } 
} 

我希望那种解释我的意思。这会工作或导致任何问题?

我正在写一个程序,需要几乎是实时软件,我目前正在决定初始化SomeClass的新实例是否更好?

希望有人能回答。如果我的问题没有意义,请评论,我会进一步解释!

感谢,

Base33

PS的代码专门针对

+0

你在什么版本的C#/ .NET? – RobertMS

+0

必须链接:[Joe Albahari的免费电子书](http://www.albahari.com/threading/) –

+0

我是一名Java程序员。但仔细看看代码后,似乎可以重用SomeClass的同一个实例。尽管只有一个线程能够运行该方法,而另一个线程则等待轮到它。至少这是Java中发生的事情。 – CKing

回答

12

每个线程都有一个单独的调用堆栈,所以是的他们都可以在同一个对象上使用相同的方法。事实上,如果需要,每个线程都可以(通过递归)在同一个实例上多次调用相同的方法

然而,什么可能你绊倒是,如果你使用的是状态在该对象(实例或静态字段等,以及任何来自该州相关)。您需要确保您对任何共享状态的访问权限能够充分考虑(并且可能是同步)多线程访问。

3

是的,你可以做到这一点的例子:)写。但是,您必须确保您的成员在该方法中的访问是线程安全的。

如果您改变对象的状态,您应该锁定您的读写操作(而不是说任何特定的机制),或者验证在任何给定时间中断方法是无害的,并且另一个线程调用另一个线程仍然会正常工作

1

如果我有一个DoSomething()方法的对象,如果我为这个方法创建多个线程,它是否可以工作,它会作为一个独立的线程运行吗?

是的,这是可能的。在您的代码示例中,DoSomething正在SomeClass的相同实例上调用。两个线程都分享这个。您有两个不同的线程,但共享一个实际对象。

这个工作还是会导致任何问题?

这完全取决于你的用例。它可能也可能不会。如果共享对象,则需要同步对它们的访问。

1

它没有问题。我将运行没有任何错误。

这就像在这个对象上创建一个对象和调用方法两次。只有事实是两个发生调用相同的方法是在 不同的线程。

相关问题