- 线程Thread:
- 创建:var t1=new Thread(()=>{…}); var t2=new Thread((object obj)=>{…});
- 启动:t.Start();
- 暂停:Thread.Sleep(TimeSpan.FromSeconds(2));
- 等待线程执行完再执行主线程:t.Join();
- 终止线程:t.Abort();
- 获取线程状态:t.ThreadState或Thread.CurrentThread.ThreadState;
- 线程优先级:t.Priority;
- 后台线程(前台线程结束后立即结束):t.IsBackground = true;
- 线程传参(3种方式):1、var obj=new X(n);new Thread(obj.Count); 2、t.Start(n); 3、new Thread(()=>Count(n));
- 主线程无法捕获子线程中的异常。
- 委托线程:例:var act=new Action<object>(Method); IAsyncResult result = act.BeginInvoke(“Thread Param”, CallBack, “Callback Param”); var rr = act.EndInvoke(result);
- 线程池:由于线程的创建和销毁比较耗费资源,所以为了重用线程,需要放入线程池。线程池里的线程默认为后台线程。ThreadPool.QueueUserWorkItem(Method, parm)表示把线程Method放入池中,pram为线程参数。
- Task类:能传参和返回值的线程。Task<TResult>(Method, parm),TResult表示线程结束后返回的值类型。Task cwt=t.ContinueWith(task=>{});表示t完成后启动另一个新线程。
- 线程同步:多个线程共享对象时,会产生使用竞争,需要线程同步。
- 解决方法:只使用最小的原子操作、加锁、给信号。
- Interlocked:提供了Increment()、Decrement()和Add等数学操作的原子方法。
- 加锁:lock(obj){},obj最好为私有对象。
- Monitor锁:通过Monitor.Enter()和Monitor.Exit()实现排它锁的获取和释放。Monitor.TryEnter(obj, TimeSpan.FromSeconds(10)) 请求不到资源时不会阻塞,可以设置超时时间,获取不到返回false。
- SemaphoreSlim:用户模式,构造函数提供允许的并发线程数目。实例作为线程共享对象。s.Wait()表示等待获取执行权,获取后执行后面代码;s.Release()表示释放执行权。
- AutoResetEvent:内核模式,实例作为线程共享对象。a.WaitOne()表示等待获取执行权,获取后执行后面代码;a.Set()表示释放执行权。
- ManualResetEventSlim:实例作为线程共享对象。m.Wait()表示等待获取执行权,获取后执行后面代码;m.Set()表示释放执行权。m.Reset()收回执行权。
- CountdownEvent:构造函数指定需发送的信号数。C.Wait()表示等待所有信号发送完毕;c.Signal()表示发送一个信号;c.Dispose()表示释放此对象。
- Barrier:构造函数指定线程数和所有线程都执行一遍后的回调函数。B.SignalAndWait()表示发送一个信号并等待。
- ReaderWriterlockSlim:读操作锁为共享锁,多个线程可以并发读取资源,而写操作为独占锁,只允许一个线程操作。r.EnterReadLock()表示开始进入读取数据锁;r.ExitReadLock()表示退出读取锁;r.EnterUpgradeableReadLock()表示进入可能修改数据的读取锁;r.ExitUpgradeableReadLock()表示退出可能修改数据的读取锁;r.EnterWriteLock()表示进入写数据锁;r.ExitWriteLock()表示退出写数据锁。获取写锁后数据会处于阻塞状态。
posted @
2018-12-26 18:30
云飞燕
阅读(
153)
评论()
收藏
举报