在C#中,Thread类提供Join()方法,该方法允许一个线程等待,直到另一个线程完成其执行。如果t是当前正在执行其线程的Thread对象,则t.Join()会导致当前线程暂停其执行,直到它加入的线程完成其执行为止。
如果有多个线程调用Join()方法,这意味着联接上的重载允许程序员指定等待时间。但是,与睡眠一样,Join依赖于操作系统进行计时,因此您不应假定Join将完全按照您指定的时间等待。
Thread.Join()
方法的重载列表中有三种方法,如下所示:
- Join()方法:此方法阻塞调用线程,直到此实例表示的线程终止,同时继续执行标准COM和SendMessage泵送。
句法:
public void Join ();
- Join(Int32)方法:此方法将阻塞调用线程,直到此实例表示的线程终止或在继续执行标准COM和SendMessage泵送过程中经过了指定的时间为止。
句法:
public bool Join (int millisecondsTimeout);
- Join(TimeSpan)方法:此方法将阻塞调用线程,直到此实例表示的线程终止或在继续执行标准COM和SendMessage泵送过程中经过了指定的时间为止。
句法:
public bool Join (TimeSpan timeout);
范例1:
// C# program to illustrate the
// concept of Join() method
using System;
using System.Threading;
public class ExThread
{
// Non-Static method
public void mythread()
{
for (int x = 0; x < 4; x++)
{
Console.WriteLine(x);
Thread.Sleep(100);
}
}
// Non-Static method
public void mythread1()
{
Console.WriteLine("2nd thread is Working..");
}
}
// Driver Class
public class ThreadExample
{
// Main method
public static void Main()
{
// Creating instance for
// mythread() method
ExThread obj = new ExThread();
// Creating and initializing threads
Thread thr1 = new Thread(new ThreadStart(obj.mythread));
Thread thr2 = new Thread(new ThreadStart(obj.mythread1));
thr1.Start();
// Join thread
thr1.Join();
thr2.Start();
}
}
输出:
0
1
2
3
2nd thread is Working..
说明:在上面的示例中,我们有一个名为ExThread的类,并且该类包含一个非静态方法,即mythread()
和mythread1()
。因此,我们创建了一个实例,即ExThread类的obj ,并在ThreadStart类的构造函数中引用了它。使用Thread thr1 = new Thread(new ThreadStart(obj.mythread));
语句,我们创建一个名为thr1的线程并初始化该线程的工作,类似于thr2 。通过使用thr1.Join();
语句,我们将把thr2的调用发送到等待状态,直到thr1线程的工作完成。此后, thr2线程执行。
范例2:
// C# program to illustrate the
// concept of Join() method
using System;
using System.Threading;
class GFG {
// Creating TimeSpan for thread
static TimeSpan mytime = new TimeSpan(0, 0, 1);
// Main method
public static void Main()
{
// Creating and initializing new thread
Thread thr = new Thread(mywork);
thr.Start();
if (thr.Join(mytime + mytime)) {
Console.WriteLine("New thread is terminated");
}
else {
Console.WriteLine("Join timed out");
}
}
static void mywork()
{
Thread.Sleep(mytime);
}
}
输出:
New thread is terminated
参考:
- https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.thread.join?view=netframework-4.7.2