【问题标题】:When Thread Join is used c# [duplicate]当使用线程连接时c# [重复]
【发布时间】:2015-05-25 17:57:30
【问题描述】:
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() 的意图。谢谢

【问题讨论】:

    标签: c# multithreading


    【解决方案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() 返回。

    【讨论】:

      【解决方案2】:

      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 个线程并完成最后一项的工作。

      尽可能(或完全避免)避免Joining 肯定是一个好主意,通常可以让您更有效地使用可用线程,但Joining 很简单,而且简单也很好。

      【讨论】:

      • 您给出的示例代码不太清楚您的意图,因为您从线程运行 DoWork() 并通过主线程调用 DoWork()。仍然 thread.join() 意图不是很清楚。寻找有点现实的例子。谢谢
      • 我运行DoWork 两次,因为这就是原始问题中的示例正在做的事情,但需要三个线程来做。
      • 很抱歉,但您的示例不能正确解释连接函数的正确用法。如果可能,请举另一个例子。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2020-07-03
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      相关资源
      最近更新 更多