多线程目的:其实就是希望“并行”执行多任务,提升效率。
单核多线程基于时间片轮询 并发而非并行
线程最大数等于cpu核心数为佳
namespace thinger.ThreadDemo
{class Program{//主线程static void Main(string[] args){Console.WriteLine("这个是主线程执行的任务1!");//。。。。。。。Thread thread = new Thread(TStart); //基于委托传递具体方法//设为后台线程,前台线程执行完, 后台线程会被强制终止thread.IsBackground = true;thread.Start();Thread thread2 = new Thread(() =>{Thread.Sleep(2000);//模拟线程执行时间是2秒Console.WriteLine("这个是子线程2执行的内容!");});thread2.IsBackground = true;thread2.Start();Console.WriteLine("这个是主线程执行的任务2");Console.WriteLine("这个是主线程执行的任务3");Console.WriteLine("----------------------------");Console.ReadLine();}static void TStart(){Thread.Sleep(3000);//模拟线程执行时间是2秒Console.WriteLine("这个是子线程1执行的内容!");}}
}
同步执行
阻塞与串行:同步执行通常是阻塞且串行的。这意味着当一个任务开始时,调用它的线程会一直等待该任务完成,期间不会执行其他任务
异步执行
非阻塞与并发(或并行):异步执行是非阻塞的,允许并发或并行处理。在异步模型中,发起一个异步操作后,调用者可以立即继续执行其他代码,而不必等待该操作完成。
从主线程的角度来看,是否是异步取决于主线程的行为:
- 如果主线程调用了
Thread.Start()
后立即继续执行其他代码而不等待新线程完成,那么这确实是异步执行。 - 如果主线程调用了
Thread.Join()
等待新线程完成后再继续,那么从主线程的角度看,这是同步执行,因为主线程会阻塞直到新线程完成。