一 Thread.Join() 官网解释如下:
Join 一个同步方法,该方法阻止调用线程 (即调用方法的线程) ,直到 Join 调用方法的线程完成。 使用此方法可以确保线程已终止。 如果线程未终止,调用方将无限期阻止。 在下面的示例中, Thread1 线程调用的 Join() 方法 Thread2 ,这会导致 Thread1 一直阻止到 Thread2 完成为止。
个人感觉初学者很难弄清楚中间的专业名词,所以我将自己的使用体会记录下来,希望能给初学者一定的帮助。
二 个人对官网解释的理解:
1.一个线程在执行的过程中,可能调用另一个线程,前者可以称为调用线程,后者成为被调用线程。
2.Thread.Join方法的使用场景:调用线程挂起,等待被调用线程执行完毕后,继续执行。
3.被调用线程执行Join方法,告诉调用线程,你先暂停,我执行完了,你再执行。从而保证了先后关系。
三 实例讲解
using System;
using System.Threading;public class Example
{
static Thread thread1, thread2;
public static void Main()
{
thread1 = new Thread(ThreadProc);
thread1.Name = "Thread1";
thread1.Start();
thread2 = new Thread(ThreadProc);
thread2.Name = "Thread2";
thread2.Start();
} private static void ThreadProc()
{
// 这里具体是哪一个线程运行是不一定的,随机分配的
Console.WriteLine("\nCurrent thread123: {0}", Thread.CurrentThread.Name);
//这里的作用就是在当前是线程1,线程2的状态暂时还在等待状态时。线程1(调用线程)中间去调用线程2(被调用线程) 一直到线程2执行该方法完毕才继续回来执行线程1
if (Thread.CurrentThread.Name == "Thread1" && thread2.ThreadState != ThreadState.Unstarted)
thread2.Join(); Thread.Sleep(6000);
Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);
Console.WriteLine("Thread1: {0}", thread1.ThreadState);
Console.WriteLine("Thread2: {0}\n", thread2.ThreadState);
}
}执行效果如下:
// The example displays output like the following:
// Current thread: Thread1
//
// Current thread: Thread2
//
// Current thread: Thread2
// Thread1: WaitSleepJoin
// Thread2: Running
//
//
// Current thread: Thread1
// Thread1: Running
// Thread2: Stopped
案例二:
using System;
using System.Net;
using System.Threading;namespace ConsoleApp1thread_join
{ public class Apha
{
public void methThread()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(Thread.CurrentThread.Name + ": i= " + i);
}
}
}
class Program
{
static void Main(string[] args)
{
Apha apha = new Apha();
Thread.CurrentThread.Name = "Main Thread";
Thread sub_thread = new Thread(new ThreadStart(apha.methThread));
sub_thread.Name = "Sub Thread";
for (int j = 0; j < 20; j++)
{
if (j == 10)
{
sub_thread.Start();
//o_thread.Abort(); //如果此代码存在,sub_thread。因为并不是立即执行.Start()方法
// 因为在主线程里面调用了sub_.join() 就一直要调用 sbthread 执行完毕以后才返回主线程继续执行
sub_thread.Join();
}
else
{
Console.WriteLine(Thread.CurrentThread.Name + ": j = " + j);
}
}
Console.ReadLine();
} }
}
执行效果图如下:
代码中的“sub_thread.Join();”要是删除的话,执行结果如下:即主线程和sub_thread会交替执行.
执行效果如下: