进程,线程,线程生命周期,原生线程,线程调度,Thread,ThreadPool,Task,Parallel,线程安全容器
1.进程;程序在服务器上运行时,占用的计算机资源合集,就是进程
2.线程:是程序能够独立运行的最小单位,共享进程的资源;
3.线程的生命周期:
3.1 新建,启动,可运行,正在运行,new,start,runnable,running,dead,blocked阻塞
4.原生线程:由操作系统负责创建、运行、切换、终止的线程就是原生线程
5.线程的调度:轮转调度,优先级调度,由操作系统控制管理,根据资源闲忙情况决定
6..net core托管线程Thread
7.thread 线程
.net程序里thread 有属性,有常用方法
7.1常用属性
CurrentThread 获取当前正在运行的线程。
IsAlive 获取指示当前线程的执行状态的值。
IsBackground 获取或设置一个值,该值指示某个线程是否为后台线程。
IsThreadPoolThread 获取指示线程是否属于托管线程池的值。
ManagedThreadId 获取当前托管线程的唯一标识符。
Name 获取或设置线程的名称。
Priority 获取或设置指示线程的调度优先级的值。
ThreadState 获取一个值,该值包含当前线程的状态。
7.2常用方法
Start() 导致操作系统将当前实例的状态更改为 Running。
Sleep(TimeSpan) 将当前线程挂起指定的时间。
Join() 在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻止调用线程,直到由该实例表示的线程终止。
GetDomainID() 返回唯一的应用程序域标识符。
Suspend() 已过时。挂起线程,或者如果线程已挂起,则不起作用。
Resume() 已过时。继续已挂起的线程。
Finalize() 确保垃圾回收器回收 Thread 对象时释放资源并执行其他清理操作。
Abort() 在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。 调用此方法通常会终止线程。
ResetAbort() 取消当前线程所请求的 Abort(Object)。
7.3 Thread的缺陷:
官方提供了丰富的API,Thread操纵的是托管线程,然后对CPU发出指令,操控原生线程。这就导致响应不灵敏,无法很好的控制线程。
Thread对启动线程数量不设控制,如果使用不当,会造成死机。
8.ThreadPool(Framework2.X)
ThreadPool缺陷
1.提供的API太少了,无法操控线程。虽然可以使用ManualResetEvent来进行阻塞和恢复线程,但是操作还是不方便
- Task(Framework4.X)
9.1Task:
1.类 Task 表示一个不返回值且通常异步执行的单个操作
2.派生类 Task 表示返回值且通常异步执行的单个操作
3.Task的工作通常以异步方式在线程池线程上执行
9.2 Task的属性:
CompletedTask 获取一个已成功完成的任务。
CurrentId 返回当前正在执行 Task 的 ID。
Exception 获取导致 AggregateException 提前结束的 Task。 如果 Task 成功完成或尚未引发任何异常,这将返回 null。
Factory 提供对用于创建和配置 Task 和 Task 实例的工厂方法的访问。
IsCompleted 获取一个值,它表示是否已完成任务。
9.3 Task的方法:
Start() 启动 Task,并将它安排到当前的 TaskScheduler 中执行。
Run(Action) 将在线程池上运行的指定工作排队,并返回代表该工作的 Task 对象。
Delay(Int32) 创建一个在指定的毫秒数后完成的任务。
ContinueWith(Action) 创建一个在目标 Task 完成时异步执行的延续任务。
Dispose() 释放 Task 类的当前实例所使用的所有资源。
Wait() 等待 Task 完成执行过程。
WhenAny(Task[]) 非阻塞,任何提供的任务已完成时,创建将完成的任务。
WhenAll(Task[]) 非阻塞,创建一个任务,该任务将在数组中的所有 Task 对象都已完成时完成。
WaitAny(Task[]) 阻塞线程,等待提供的任一 Task 对象完成执行过程。
WaitAll(Task[]) 阻塞线程,等待提供的所有 Task 对象完成执行过程。
- parallel(TPL)(Framework4.5)
Parallel 数据并行(任务并行库)简单理解就是 Task WaitAll + 主线程(参与计算)
数据并行指的是对源集合或数组的元素同时(即,并行)执行相同操作的场景。 在数据并行操作中,对源集合进行分区,以便多个线程能够同时在不同的网段上操作
10.1 常用方法
Paraller.For()、Parallel.ForEach()、Parallel.Invoke()
10.2 修改parallel线程数量
ParallelOptions options = new ParallelOptions();
options.MaxDegreeOfParallelism = 3;
- 线程安全容器
ConcurrentBag 表示对象的线程安全的无序集合。
ConcurrentDictionary 表示可由多个线程同时访问的键/值对的线程安全集合。
ConcurrentQueue 表示线程安全的先进先出 (FIFO) 集合。
ConcurrentStack 表示线程安全的后进先出 (LIFO) 集合。