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)的区别