c#中Thread.Join()方法的经典示例

在 C# 中,Thread.Join 是一个非常有用的方法,它可以让主线程(调用线程)等待子线程(被调用线程)执行完毕后再继续执行。

1、经典示例1

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();
        Console.ReadKey();
    }

    private static void ThreadProc()
    {
        Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);
        if (Thread.CurrentThread.Name == "Thread1" &&
            thread2.ThreadState != ThreadState.Unstarted)
        {
            Console.WriteLine("thread2.Join");
            thread2.Join(); 
        }
            

        Thread.Sleep(1000);
        Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);
        Console.WriteLine("Thread1: {0}", thread1.ThreadState);
        Console.WriteLine("Thread2: {0}\n", thread2.ThreadState);

    }
}

运行结果


Current thread: Thread1
thread2.Join

Current thread: Thread2

Current thread: Thread2
Thread1: WaitSleepJoin
Thread2: Running


Current thread: Thread1
Thread1: Running
Thread2: Stopped

这个例子演示了“Thread.Join 会阻塞调用线程,直到被调用线程完成执行”

2、经典示例2

using System.Threading;
using System;

class TestThread
{
    private static void ThreadTst()
    {
        Console.WriteLine("  " + Thread.CurrentThread.Name + "   开始执行");
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine("     " + Thread.CurrentThread.Name + "   i =  " + i);
            Thread.Sleep(10);
        }
        Console.WriteLine("  " + Thread.CurrentThread.Name + "   执行完毕");
    }
    static void Main(string[] args)
    {
        //程序调用了Main()函数时,就起动了一个进程,同时也启动了一个线程[这个线程就是主线程].
        Thread.CurrentThread.Name = "MainThread";

        //创建第一个线程
        Thread tA = new Thread(new ThreadStart(TestThread.ThreadTst));
        tA.Name = "线程A";
        Thread tB = new Thread(new ThreadStart(TestThread.ThreadTst));
        tB.Name = "线程B";
        Thread tC = new Thread(new ThreadStart(TestThread.ThreadTst));
        tC.Name = "线程C";
        Thread tD = new Thread(new ThreadStart(TestThread.ThreadTst));
        tD.Name = "线程D";

        for (int z = 0; z < 20; z++)
        {
            if (z == 3)
            {
                Console.WriteLine("tA.Start");
                tA.Start();
                Console.WriteLine("tB.Start");
                tB.Start();
            }
            else if (z == 6)
            {
                Console.WriteLine("tA.Join");
                tA.Join();
                Console.WriteLine("tB.Join");
                tB.Join();
            }
            else if (z == 9)
            {
                Console.WriteLine("tC.Start");
                tC.Start();
                Console.WriteLine("tD.Start");
                tD.Start();
            }
            else
            {
                Console.WriteLine(Thread.CurrentThread.Name + "   z =  " + z);
            }
        }
        Console.Read();
    }
}

运行结果

MainThread   z =  0
MainThread   z =  1
MainThread   z =  2
tA.Start
tB.Start
MainThread   z =  4
MainThread   z =  5
tA.Join
  线程A   开始执行
     线程A   i =  0
  线程B   开始执行   ->注意这里并没有返回调用线程,这里是线程B
     线程B   i =  0
     线程A   i =  1
     线程B   i =  1
     线程A   i =  2
     线程B   i =  2
     线程A   i =  3
     线程B   i =  3
     线程A   i =  4
     线程B   i =  4
     线程A   i =  5
     线程B   i =  5
     线程A   i =  6
     线程B   i =  6
     线程A   i =  7
     线程B   i =  7
     线程A   i =  8
     线程B   i =  8
     线程B   i =  9
     线程A   i =  9
  线程A   执行完毕
  线程B   执行完毕
tB.Join              ->注意线程B已经执行完毕了
MainThread   z =  7
MainThread   z =  8
tC.Start
tD.Start
MainThread   z =  10
MainThread   z =  11
MainThread   z =  12
MainThread   z =  13
MainThread   z =  14
MainThread   z =  15
MainThread   z =  16
MainThread   z =  17
MainThread   z =  18
MainThread   z =  19
  线程C   开始执行    ->线程C是等主线程结束后才开始执行的
     线程C   i =  0
  线程D   开始执行
     线程D   i =  0
     线程C   i =  1
     线程D   i =  1
     线程C   i =  2
     线程D   i =  2
     线程C   i =  3
     线程D   i =  3
     线程C   i =  4
     线程D   i =  4
     线程C   i =  5
     线程D   i =  5
     线程C   i =  6
     线程D   i =  6
     线程C   i =  7
     线程D   i =  7
     线程C   i =  8
     线程D   i =  8
     线程C   i =  9
     线程D   i =  9
  线程C   执行完毕
  线程D   执行完毕

这个例子主要目的是对比使用join(线程A、)和未使用join(线程C)的区别

你可能感兴趣的:(c#,开发语言,笔记)