线程笔记
问题汇总:
1.Interrupt这个方法会抛出异常,所以要捕获,原书中没有.
2.Thread的Sleep方法已经是static的,直接使用Thread.Sleep()代替实例方法
3.TryEnter方法的使用,是否需要Monitor.Exit()搭配使用 P89 书中Sample报错
4.AutoResetEvent类 信号概念
5.Mutex P101, 书中Sample出错:少两行输出,其实是有异常未捕获到
第1章
AppDomain应用程序域,密闭类
进程(对应一个dll)--AppDomain--线程,都是一对多
AppDomain中存放一个HashTable,通过AppDomain的GetData和SetData来操作这些数据
AppDomain.CreateDomain("AppDomain名")创建新的AppDomain
AppDomain实例.DoCallBack(委托方法),从而使同一个线程跨越多个AppDomain来执行
通过AppDomain.CurrentDomain来获取当前AppDomain
第2章
System.Threading
1.创建一个线程:
Thread t = new Thread(委托方法);等价于:
ThreadStart ts = new ThreadStart(委托方法);
Thread t = new Thread(ts);
t.Start();
新线程B的建立会立刻中断当先线程A,直到B执行完毕,才会再执行A
2.IsAlive属性,ThreadState属性,以及Sleep()方法
这里的Sleep方法为
Thread.CurrentThread.Sleep();
3.ThreadPriority枚举,设置线程的优先级,最高为Highest,当前运行的为Running
4.Timer与TimerCallBack配合使用,确保同步.
演示一个很有用的模型TimerExample
5.线程的生存期 有一张流程图
ThreadState枚举
唤醒Sleep线程的唯一方法:Interrupt()
6.使用线程的2个好处,2个坏处
线程只能在回调一个无参方法.如果回调方法需要参数,就要使用delegate
第3章 使用线程
同步的定义,在任一时刻只允许一个线程访问某一资源的现象称为同步,从而避免竞争条件,确保线程安全.
3种方法保证线程安全性
1.同步临界区
2.使对象不可改变
3.使用线程安全包装器
3种.NET同步策略:
1.同步上下文 [SynchronizationAttribute] class A : ContextBoundObject
2.同步代码区
Monitor类
Enter和Exit方法 等价于SyncLock
Wait和Pulse方法(PulseAll方法)
TryEnter方法
ReaderWriterLock类
3.手控同步
ManualResetEvent类, WaitOne()以及Reset(),Set()方法的使用
AutoResetEvent类
Mutex类
InterLock类, 使用到线程池 i++的另类写法
静态变量/方法的同步
ThreadStaticAttribute的使用
死锁
范例不错
SyncLock 是vb语法, C#中为lock
线程安全包装器
Hashtable是线程安全的,只要调用其静态Synchronized方法:
Hashtable ht = Hashtable.Synchronized(new Hashtable());
我们的目的是打造一个支持线程安全的集合,于是在其中内嵌Hashtable,得以实现--所谓包装器一词的由来.
第4章 线程模式
MTA 自由线程(多线程单元) NET默认
STA 单元模型线程(单线程单元) 基于队列, 有AppDomain管理 在方法前加上[STAThread]
ASP.NET中使用STA COM组件,声明<%@ Page AspCompact="true" %> (默认ASP.NET页面都是MTA的)
在Thread类的ApartmentState属性来设置线程的模式,有3种:MTA,STA,Unknown(未设置)
多线程之间的关系: 3个模式图
1.主线程和工作者线程模式
2.对等线程模式
3.管道线程模式
第5章 线程池
ThreadPool类
两个关键语句
1.QueueUserWorkItem(回调方法)
QueueUserWorkItem(回调方法, 传递到回调方法中的参数)
*注:该方法已经改为static型
2.RegisterWaitForSingleObject()
要配合AutoResetEvent()使用
规则:
每个ThreadPool对象只能有一个工作者线程
每个进程只能有一个ThreadPool对象
第一次创建ThreadPool对象是当我们调用ThreadPool.QueueUserWorkItem()方法,或者是通过计时器或已注册等待的操作调用回掉方法时发生的
线程池管理器
ArrayList和Hashtable实现了异步方法:
ArrayList.Synchronized(new ArrayList());
Hashtable.Synchronized(new Hashtable());
第6章 调试,跟踪
4个代码跟踪类: Trace, Debug, BooleanSwitch, TraceSwitch
Trace.Assert()
Trace.WriteLine()
配合3种侦听器 EventLogTraceListener, TextWriterTraceListener, DefaultTraceListener
以及侦听器管理器 Trace.Listeners
BooleanSwitch, TraceSwitch两个类的使用.