计算机概念
进程
-
程序在服务器上运行时,占据的计算资源合集,称之为进程
-
进程之间不会相互干扰---进程间的通信比较困难(分布式)
线程
-
程序执行的最小单位,响应操作的最小执行流,
-
线程也包含自己的计算资源,
-
线程是属于进程的,一个进程可以有多个线程
多线程
- 一个进程里面,有多个线程并发执行
Task类创建多线程(推荐)
- Task线程是基于线程池的
- 供了丰富的API
- Task被称之为多线程的最佳实践。
Action action = () =>
{
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} ---action--执行结束---{DateTime.Now}");
};
//方式1
Task task = new Task(action);
task.Start();
//方式2
Task.Run(action);
Thread类创建多线程
- Thread的API特别丰富,可以玩的很花哨,但是,因为线程资源是操作系统管理的,响应并不灵敏,所以没那么好控制
- Thread 启动线程是没有控制的,如果启动太多,可能导致死机,
ThreadStart threadStart = () =>
{
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} ---action--执行结束---{DateTime.Now}");
};
Thread thread = new Thread(threadStart);
thread.Start();
//写法2 DoTask为一个方法
new Thread(DoTask).Start();
ThreadPool类创建多线程
- ThreadPool:池化资源管理设计思想, 池化就是做一个容器,容器提前申请N个线程,程序需要使用线程,直接找容器获取,用完后再放回容器(控制状态),避免频繁的申请和销毁;容器自己还会根据限制的数量去申请和释放;
- 线程复用
- 可以限制最大线程数量
- api太少,线程等待顺序控制很弱。
WaitCallback waitCallback = action =>
{
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} ---action--执行结束---{DateTime.Now}");
};
ThreadPool.QueueUserWorkItem(waitCallback);
委托方式创建多线程
Action action = () => { Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} ---action--执行结束---{DateTime.Now}"); };
IAsyncResult asyncResult = action.BeginInvoke(null, null);
Parallel创建多线程
- Parallel可以启动多个线程去并发执行多个Action,它是多线程的。Parallel最直观的特点是主线程(当前线程)也会参与计算---阻塞界面(主线程忙于计算,无暇他顾)。
- Parallel是在Task的基础上做了一个封装,它的效果等于TaskWaitAll+主线程(当前线程)参与计算。
Action action = () => { Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} ---action--执行结束---{DateTime.Now}"); };
Action action2 = () => { Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} ---action2--执行结束---{DateTime.Now}"); };
Action[] actions = new Action[] { action, action2 };
Parallel.Invoke(actions);