线程笔记

问题汇总:
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两个类的使用.

原文地址:https://www.cnblogs.com/Jax/p/1076717.html