Thread.start后面紧跟Thread.join - 它有用吗?

时间:2012-11-12 13:26:40

标签: c# multithreading

我在其他人编写的项目中的许多地方都遇到过这样的代码,我仍然很困惑为什么会有人编写这样的代码。

考虑以下代码(此代码在C#中,但我认为它也适用于许多语言 - 可能只是在语法上有所不同,或者可能是类的名称和执行此操作的方式 - 你明白了。):< / p>

Thread thread;

thread = new Thread(new ThreadStart(method));
thread.Start();
thread.Join();

据我了解,这段代码意味着启动一个线程并运行method,然后这个线程等待,而不做任何其他事情,让新启动的线程完成。

如果是这种情况,为什么我不直接调用该方法,即

method()

如果我的理解是对的,有人可以向我解释一下吗?第一个代码片段在功能上是否与第二个代码片段相同?

2 个答案:

答案 0 :(得分:12)

通常是,你是对的,这不是一件非常有用的事情。

但有时,您可能希望操作在单独的线程上运行,因为它会修改或依赖于某些每线程状态。

该函数可能正在摆弄线程本地数据,或者它可能调用本机COM代码,并且COM的线程公寓内容基于每个线程进行初始化,因此要避免受到调用代码更改的影响,您可能只想剥离一个新线程来调用该函数。

当然,在这种情况下,一个小代码评论解释为什么这么显然无用的东西,可能是个好主意。 ;)

答案 1 :(得分:4)

功能上两段代码都是一样的。线程案例只是调用高价格的代理。但在某些情况下可能会有所帮助:

  • 您的线程有另一个安全上下文,但您希望在默认情况下执行。模拟可能花费与处理池中的线程
  • 相同的处理器时间
  • 您的线程比当前更大(或更低一段时间)优先级 - 所以代码的关键部分可以在接近运行时执行。对于低优先级,您假设有一些大的等待(例如来自用户输入)