多线程

多线程

线程是操作系统中能够独立运行的最小单位,是进程的一部分,一个进程可以包含多个线程,线程可以共享进程的资源。

进程有入口线程(主线程)

多线程:批量重复任务同时进行

线程池:异步默认使用线程池

线程安全:多个线程共享资源时,数据不一致导致问题。
原子操作:执行过程中不可中断的操作,要么执行要么不执行。

加锁解决结果比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
posted @ 2026-04-01 14:43  hélium  阅读(17)  评论(0)    收藏  举报