关于Thread.Join的困惑

时间:2016-01-20 07:40:48

标签: c# multithreading concurrency parallel-processing

我对Thread.Join()方法有一点混淆。我看过THIS MSDN帖子和几篇SO帖子,但无法清除这种混乱。

如果有多个线程,它是否等待所有线程完成?或阻止下一个线程的执行直到第一个完成?假设以下场景:

List<Thread> myThreads = new List<Threads>();
while(someCondition == true)
{
   Thread thread = new Thread(new ThreadStart(delegate 
                {
                    processSomeCalculations(x, y);
                })); 
    thread.Start();
    myThreads.Add(thread);

}

foreach (Thread thread in myThreads)
{
   thread.Join();
}

Print("all threads completed now");

在上面的场景中,当第一个列表项(即列表的第一个线程)调用thread.Join()时,does it mean that thread 2 (i.e, the second thread of the list) can NEVER continue its execution, until first thread has been completed?

OR

这是否意味着all the threads in the list will continue execution in PARALLEL manner, and PRINT method will be called after all threads have finished execution?

我的问题摘要:在上面的场景中,所有线程都会继续在PARALLEL中执行吗?或者他们将在第一次执行完毕后逐一执行?

2 个答案:

答案 0 :(得分:3)

它是后者,它将简单地阻止主线程上的执行,直到您生成的所有线程都已完成执行,或者在这种情况下完成processSomeCalculations(x, y),然后打印"all threads completed now"

答案 1 :(得分:2)

正如雅各布已经说过的,它是后者。 此外,您可以将代码视为以下内容:

1。)启动多个线程

2.)然后在你的循环中:从列表中取出第一个线程并阻塞主线程直到第一个线程完成。只有主线程(即调用.Join()的线程)被阻塞,所有其他线程继续。

3 ... n。)再次内循环:获取下一个线程并阻塞主线程直到这个线程完成(或者如果线程已经完成则继续)

在循环之后,您可以确保所有线程都已完成。