在对象的实例上为同一方法创建多个线程
本文关键字:创建 方法 线程 对象 实例 | 更新日期: 2023-09-27 18:36:54
我有一个问题。 如果我有一个带有方法 DoSomething() 的对象,如果我为此方法创建多个线程,它是否可行且有效,它会作为自己的单独线程运行吗?
例如
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 的新实例是否更好?
希望有人能回答。 如果我的问题没有意义,请发表评论,我会进一步解释!
谢谢
基数33
PS 该代码是专门为示例编写的:)
每个线程都有一个单独的调用堆栈,所以是的,它们可以在同一对象上使用相同的方法。事实上,如果需要,如果你真的愿意,每个线程都可以(通过递归)在同一实例上多次调用相同的方法。
但是,如果您在该对象中使用状态(实例或静态字段等,以及与该状态相关的任何内容),可能会让您感到困惑。您需要确保对任何共享状态的访问充分考虑(并且可能同步)多线程访问。
是的,你可以这样做。但是,您必须确保该方法中的成员访问是线程安全的。
如果你改变了对象的状态,你应该锁定你的读写(不说任何特定的机制),或者验证在任何给定时间中断方法是无害的,并且不同线程上的另一个调用仍然可以正常工作
如果我有一个带有方法 DoSomething() 的对象,如果我为此方法创建多个线程,它是否可行且有效,它会作为自己的单独线程运行吗?
是的,这是可能的。 在您的代码示例中,DoSomething
是在同一个 SomeClass
实例上调用的。 两个线程都共享这一点。 您有两个不同的线程,但共享一个实际对象。
这会起作用还是会导致任何问题?
这完全取决于您的用例。 它可能会也可能不会。 如果对象是共享的,则需要同步对它们的访问。
它没有问题。我将运行没有任何错误。
这就像创建一个对象并在此对象上调用方法 两次。唯一的事实是调用相同方法的两次出现是打开的 不同的线程。