当我们使用C#中的多线程编程时,有时候需要在主线程中等待子线程完成后再继续执行。Thread.Join()函数就是用来实现这一功能的。本文将全面介绍Thread.Join()函数的用法及示例说明。
什么是Thread.Join()函数
Thread.Join()函数是Thread类中的一个方法,它的作用是阻塞主线程,直到当前线程执行完成。当调用Thread.Join()函数时,主线程将等待该线程执行完成后再继续执行下面的代码。
Thread.Join()函数有两个重载方法,分别为:
public void Join();
public bool Join(int milliseconds);
其中,第一个重载方法将阻塞当前线程,直到被调用的线程执行完成后再返回。第二个重载方法增加了一个参数,可以指定等待的时间,在指定的时间内等待被调用的线程执行完成。如果在给定的时间内线程仍没有完成执行,Join()函数将会返回false,当然,如果在指定时间内线程已经完成了执行,Join()函数将会返回true。
示例说明
假设现在我们有如下需求:我们需要从文件中读取1000个整数,对于每一个整数,我们要新开一个子线程进行计算,并将结果存储到一个数组中。当所有子线程执行完成后,主线程将对数组中所有的结果进行累加。
我们可以使用如下代码实现:
using System;
using System.Threading;
class Program
{
static int[] results = new int[1000];
static int sum = 0;
static void Main(string[] args)
{
//读取文件中的1000个整数
int[] nums = ReadNumsFromFile();
//创建1000个子线程,对每一个整数进行计算,并将结果存储到results数组中
for (int i = 0; i < nums.Length; i++)
{
int index = i;
Thread t = new Thread(() => CalculateNum(nums[index], index));
t.Start();
}
//主线程等待所有子线程执行完成
for (int i = 0; i < nums.Length; i++)
{
Thread t = new Thread(() => results[i].Join());
t.Start();
}
//计算所有结果的总和
for (int i = 0; i < results.Length; i++)
{
sum += results[i];
}
Console.WriteLine("结果总和为:" + sum);
}
//计算单个整数的结果
static void CalculateNum(int num, int index)
{
Thread.Sleep(100);
int result = num * num + index;
results[index] = result;
}
//从文件中读取1000个整数
static int[] ReadNumsFromFile()
{
int[] nums = new int[1000];
Random rand = new Random();
for (int i = 0; i < nums.Length; i++)
{
nums[i] = rand.Next(100);
}
return nums;
}
}
在上面的代码中,我们创建了1000个子线程来对每一个整数进行计算,并将结果存储在results数组中。主线程通过一个for循环来等待所有子线程执行完成。这里需要注意的是,在等待子线程完成时,我们使用了Thread.Join()函数来阻塞主线程。
除了上面这个示例外,我们再来看一个更加简单的示例。假设我们需要启动两个线程,让它们分别输出100行“Hello World!”:
using System;
using System.Threading;
class Program
{
static void Main(string[] args)
{
//启动两个线程
Thread t1 = new Thread(PrintHelloWorld);
Thread t2 = new Thread(PrintHelloWorld);
t1.Start();
t2.Start();
//等待两个线程执行完成
t1.Join();
t2.Join();
}
static void PrintHelloWorld()
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("Hello World! " + i);
}
}
}
在上述简单示例中,我们创建了两个线程,并调用了它们的Start()方法来启动线程。然后,主线程通过Thread.Join()函数来等待这两个线程执行完成,最后输出所有的“Hello World!”字符串。需要注意的是,在等待线程执行完成时,我们需要依次调用每个线程的Join()函数来阻塞主线程。
以上就是C#多线程中Thread.Join()函数的用法及示例说明。通过使用Thread.Join()函数,我们可以很方便地实现多线程编程中主线程等待子线程执行完成的需求。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#多线程之Thread中Thread.Join()函数用法分析 - Python技术站