多线程
多线程
线程是操作系统中能够独立运行的最小单位,是进程的一部分,一个进程可以包含多个线程,线程可以共享进程的资源。
进程有入口线程(主线程)
多线程:批量重复任务同时进行
线程池:异步默认使用线程池
线程安全:多个线程共享资源时,数据不一致导致问题。
原子操作:执行过程中不可中断的操作,要么执行要么不执行。
加锁解决结果比200000小的问题:
int cnt = 0;
object obj = new object();
var thread1 = new Thread(Method);
var thread2 = new Thread(Method);
thread1.Start();
thread2.Start();
thread1.Join();
thread2.Join();
cnt.Dump();
void Method()
{
for(int i = 1; i <= 100000; i++)
lock(obj)
cnt++;
}
Join() 是 C# 中用于等待线程结束的方法。让当前线程(通常是主线程)暂停执行,直到调用 Join() 的那个线程执行完毕。
Interrupt() 是中断一个正在阻塞(等待)的线程. 被中断的线程必须捕获并处理 ThreadInterruptedException,否则线程会终止
Abort() 是强制终止线程,不要使用这个方法,会导致不可预测的后果!
多线程常用实现方式:
- 线程
- 线程池
- 异步编程
- 自带方法(Parallel:For Foreach Invoke; PLINQ:AsParallel AsSequential AsOrdered)
var thread = new Thread(obj =>
{ obj.Dump();
for( int i = 0; i < 20; i++)
{
Thread.Sleep(200);
"still running.....".Dump();
}
"finish!".Dump();
}
){IsBackground = true, Priority = ThreadPriority.Normal};
//IsBackground = true:后台线程 —— 如果主线程结束,后台线程会自动终止(不会阻止程序退出)
//Priority = ThreadPriority.Normal:设置线程优先级为普通
thread.Start();
"in main thread, waiting to finish".Dump();
thread.Join(); // 阻塞主线程,等待子线程完成
"done.".Dump();
Thread.Interrupt() 只能中断处于"等待状态"(如Sleep、Join、Wait)的线程,通过抛出ThreadInterruptedException来提前终止线程,而无法中断正在运行的代码。
var thread = new Thread( obj =>
{
try
{
while(true) Thread.Sleep(1);
//这里sleep(0)也可:
//它并不真正让线程进入“睡眠”状态。
//它的作用是让当前线程立刻放弃剩余的CPU时间片,并强制操作系统立即重新进行一次线程调度
//由于线程的状态发生了改变(从运行态->就绪态),操作系统调度器获得了控制权
}
catch(ThreadInterruptedException)
{
}
finally
{
"Thread is finished.".Dump();
}
});
thread.Start( );
"in main thread, waiting to finish.".Dump();
Thread.Sleep(1000);
//此时thread子线程在循环+休眠,主线程在休眠,直到1000ms后,期间主线程子线程并行
thread.Interrupt();
//Interrupt() 会在线程中抛出一个 ThreadInterruptedException
//但这个异常只会在线程处于 "等待状态" 时立即抛出
thread.Join();
"done.".Dump();
挂起(suspend)和恢复(resume) :过时方法,推荐使用锁、信号量实现
锁、信号量:
- lock & Monitor
- Mutex
- Semaphore
- WaitHandle
- ReaderWriterlock
轻量型:
- semaphoreSlim
- ManualResetEventSlim
- ReaderWriterLockSlim
不要自己造轮子:
- 线程安全单例:Lazy
- 线程安全的集合类型:ConcurrentBag ConcurrentStack ConcurrentQueue ConcurrentDictionary
- 阻塞集合:BlockingCollection
- 通道:Channel
- 原子操作:Interlocked
- 周期任务:PeriodicTimer

浙公网安备 33010602011771号