当前位置:   article > 正文

c# Thread.Join()方法讲解_c# thread join

c# thread join

一 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);
        }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

执行效果如下:
// 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();
        }

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

执行效果图如下:
在这里插入图片描述

代码中的“sub_thread.Join();”要是删除的话,执行结果如下:即主线程和sub_thread会交替执行.
执行效果如下:
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/197792
推荐阅读
相关标签
  

闽ICP备14008679号