• 线程笔记


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

  • 相关阅读:
    Django虚拟环境创建问题virtualenvwrapper.sh: There was a problem running the initialization hooks.
    面向对象
    使用python中ssh连接CentOS7上的数据库
    Mysql在python中的使用:pymysql
    Mysql索引原理
    Mysql数据记录操作
    Mysql完整性约束
    Mysql支持的数据类型
    Mysql账户设置_增删改查_表操作
    自己项目列表
  • 原文地址:https://www.cnblogs.com/Jax/p/1076717.html
Copyright © 2020-2023  润新知