1 线程池线程(ThreadPool)
1.1 线程的缺陷
线程资源是操作系统管理的,响应并不灵敏,所以没那么好控制;Thread启动线程是没有控制的,可能导致死机(就是可以随便开启一个新线程)
1.2 线程池定义
创建线程是昂贵的操作,所以为每个短暂的异步操作创建线程会产生显著的开销。一般情况下,都会使用池,也就是线程池进行管理。
线程池可以成功地适应于任何需要大量短暂的开销大的资源。实现分配一定的资源,将这些资源放入到资源池中。每次需要新的资源,只需要从池中获取一个,不需要创建新的,当该资源不再被使用时,就将其返回到池中。
池化资源管理设计思想,线程是一种资源,之前每次要用线程,就去申请一个线程,使用完之后,释放掉;池化就是做一个容器,容器提前申请5个线程,程序需要使用线程,直接找容器获取,用完后再放回容器(控制状态),避免频繁的申请和销毁;容器自己还会根据限制的数量去申请和释放。
1.3 优点
(1)线程复用
(2)可以限制最大线程数量
1.4 缺点
ThreadPool的API太少了,导致线程等待顺序控制特别弱,影响实战
1.5 实战
主要方法QueueUserWorkItem,具体代码:
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(ThreadProc);
Console.WriteLine("Main thread does some work, then sleeps.");
Thread.Sleep(1000);
Console.WriteLine("Main thread exits.");
Console.ReadLine();
}
// This thread procedure performs the task.
static void ThreadProc(Object stateInfo)
{
// No state object was passed to QueueUserWorkItem, so stateInfo is null.
Console.WriteLine("Hello from the thread pool.");
}
执行结果:
1.6 API
BindHandle(IntPtr)
|
已过时。
将操作系统句柄绑定到 ThreadPool。
|
BindHandle(SafeHandle)
|
将操作系统句柄绑定到 ThreadPool。
|
GetAvailableThreads(Int32, Int32)
|
检索由 GetMaxThreads(Int32, Int32) 方法返回的最大线程池线程数和当前活动线程数之间的差值。
|
GetMaxThreads(Int32, Int32)
|
检索可以同时处于活动状态的线程池请求的数目。 所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。
|
GetMinThreads(Int32, Int32)
|
发出新的请求时,在切换到管理线程创建和销毁的算法之前检索线程池按需创建的线程的最小数量。
|
QueueUserWorkItem(WaitCallback)
|
将方法排入队列以便执行。 此方法在有线程池线程变得可用时执行。
|
QueueUserWorkItem(WaitCallback, Object)
|
将方法排入队列以便执行,并指定包含该方法所用数据的对象。 此方法在有线程池线程变得可用时执行。
|
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)
|
注册一个等待 WaitHandle 的委托,并指定一个 32 位有符号整数来表示超时值(以毫秒为单位)。
|
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)
|
注册一个等待 WaitHandle 的委托,并指定一个 64 位有符号整数来表示超时值(以毫秒为单位)。
|
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)
|
注册一个等待 WaitHandle 的委托,并指定一个 TimeSpan 值来表示超时时间。
|
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)
|
指定表示超时(以毫秒为单位)的 32 位无符号整数,注册一个委托等待 WaitHandle。
|
SetMaxThreads(Int32, Int32)
|
设置可以同时处于活动状态的线程池的请求数目。 所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。
|
SetMinThreads(Int32, Int32)
|
发出新的请求时,在切换到管理线程创建和销毁的算法之前设置线程池按需创建的线程的最小数量。
|
UnsafeQueueNativeOverlapped(NativeOverlapped*)
|
将重叠的 I/O 操作排队以便执行。
|
UnsafeQueueUserWorkItem(WaitCallback, Object)
|
将指定的委托排队到线程池,但不会将调用堆栈传播到辅助线程。
|
UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)
|
注册一个等待 WaitHandle 的委托,并使用一个 32 位带符号整数来表示超时时间(以毫秒为单位)。 此方法不将调用堆栈传播到辅助线程。
|
UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)
|
注册一个等待 WaitHandle 的委托,并指定一个 64 位有符号整数来表示超时值(以毫秒为单位)。 此方法不将调用堆栈传播到辅助线程。
|
UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)
|
注册一个等待 WaitHandle 的委托,并指定一个 TimeSpan 值来表示超时时间。此方法不将调用堆栈传播到辅助线程。
|
UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)
|
指定表示超时(以毫秒为单位)的 32 位无符号整数,注册一个委托等待 WaitHandle。 此方法不将调用堆栈传播到辅助线程。
|
参考连接:https://mp.weixin.qq.com/s?__biz=MzU0ODQ5NzA4NQ==&mid=2247484603&idx=1&sn=7dc539bc911a53287afd7b6aaf5bbc41&chksm=fbbf7769ccc8fe7fecbd4363ca2629a8b374eeb4eca468527336eb6819edc3ef034e3aced8f3&cur_album_id=2012691840461783041&scene=189#wechat_redirect
https://www.bilibili.com/medialist/play/ml1297569058/BV1Yv411A73j?spm_id_from=333.999.0.0&oid=250144381&otype=2
https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.threadpool?view=netframework-4.8