使用线程连接时c#

时间:2015-05-25 09:34:56

标签: c# multithreading

System.Threading.Thread thd1 = new System.Threading.Thread(new System.Threading.ThreadStart(DoWork));
thd1.Start();
System.Threading.Thread thd2 = new System.Threading.Thread(new System.Threading.ThreadStart(DoWork));
thd2.Start();
thd1.Join();
thd2.Join();

我只想知道为什么人们使用Thread.Join() ? Thread.Join()阻止执行下一行并等待特定线程完成。当特定线程完成后,下一行就会被执行。

用正确的例子告诉我Thread.Join()的意图。感谢

2 个答案:

答案 0 :(得分:1)

这是订购线程执行的一种方法,如果在t2之前需要t1,请查看以下示例:

static void Main() 
{
    Thread t1 = new Thread(() => 
    { 
        Thread.Sleep(4000);
        Console.WriteLine("t1 is ending.");
    });
    t1.Start();

    Thread t2 = new Thread(() => 
    { 
        Thread.Sleep(1000);
        Console.WriteLine("t2 is ending.");
    });
    t2.Start();

    t1.Join();
    Console.WriteLine("t1.Join() returned.");

    t2.Join();
    Console.WriteLine("t2.Join() returned.");
}

此示例生成以下输出:

t2即将结束。 t1即将结束。 t1.Join()返回。 t2.Join()返回。

答案 1 :(得分:1)

  

Thread.Join()阻止执行下一行并等待特定线程完成。

这正是人们使用Thread.Join()的原因。

是的,你希望你的不同线程尽可能地分别做不同的事情,但是当线程A需要线程B正在获取的东西时,或者在线程B完成某事之前不能做某事,那么最简单的达到这一点的方法是使用Thread.Join()

在你的问题的例子中,这并不是非常有用,因为你有三个线程,其中一个没有用处。

稍微更现实的版本是:

Thread thd1 = new System.Threading.Thread(new ThreadStart(DoWork));
thd1.Start();
DoWork();
thd1.Join();

在这里,您有两个线程做两个线程值得工作。当我们到达thd1.Join()时,thd1可能已经完成并且加入是一个nop,但以防我们等待确保它已完成。

另一个更现实的例子是当你创建多​​个线程然后加入那些线程时,因为虽然让创建线程等待是浪费,但编写一个设置X线程的循环更简单而不是一个设置X-1线程的循环,并完成最后一项的工作。

尽可能长时间地(或者根本)避免Join肯定是一个好主意,通常可以更有效地使用可用线程,但Join很简单,简单就是好太