using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Class1
{
public static void ThreadProc()
{
for(int i = 0; i < 10; i++)
{
Console.WriteLine("ThreadProc: " + i.ToString());
Thread.Sleep(1000);
}
Console.WriteLine("ThreadProc Exit");
}
public static void Thread1()
{
for(int i = 0; i < 10; i++)
{
Console.WriteLine("第一个线程->" + i.ToString());
Thread.Sleep(1000);
}
}
public static void Thread2()
{
for(int i = 0; i < 50; i++)
{
Console.WriteLine("第二个线程->" + i.ToString());
Thread.Sleep(1000);
}
}
}
}
using System;
using System.Threading;namespace ConsoleApp1
{
class Program
{
// 结论:1.当所有前台线程结束,所有后台线程终止,当所有后台线程终止,前台线程则不受影响。
static void Main(string[] args)
{
Thread th1 = new Thread(new ThreadStart(Class1.Thread1));
Thread th2 = new Thread(new ThreadStart(Class1.Thread2));
th1.Start();
th2.Start();
for (int i = 0; i < 10; i++)
{
Console.WriteLine("主线程和两个线程一起在搞事情");
Thread.Sleep(1000);
}
// 术语
Console.WriteLine("主线程暂停, 等待子线程1运行完毕后继续,线程2正常运行");
Console.WriteLine("主线程休息了一会,决定等线程一走了再继续搞事情.线程一和线程二搞事情");
// MSDN上解释: 阻塞调用线程,等待某个线程终止
// 此处运行结果:暂停了Main线程, 等待th1线程结束,继续Main线程的运行
// 大白话解释: 暂停当前调用了(线程名.join线程)的当前线程的执行,等待(线程名.join)这个线程名代表的线程执行完毕,再重新运行当前线程。
th1.Join();
Console.WriteLine("线程一觉得很无聊,走了");
for(int i = 0; i < 10; i++)
{
Console.WriteLine("主线程在线程一走了后继续搞事情");
Thread.Sleep(1000);
}
}
}
}
join的用法,如上,大白话讲的话就是说有小明请客吃饭,在饭桌上小明看见了一个不想看见的人,于是推辞说身体不舒服,等那个人走了,小明又回来继续和大家一起吃饭。
而且,作为请客的人,即使小明吃饱了,什么事也没了,他也得在那坐着,不然谁来结账。有些人是跟小明一起来的,有些人是陪小华一起来的。
小明就是被阻塞的线程,那个令他讨厌的人就是需要等待的线程,被阻塞的线程等这个讨厌的家伙走了再继续干活。
被阻塞的线程可以是任何允许的线程!并不一定是主线程。