zoukankan      html  css  js  c++  java
  • 线程笔记

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

  • 相关阅读:
    AcWing 157. 树形地铁系统 (hash判断树同构)打卡
    AcWing 156. 矩阵 (哈希二维转一维查询)打卡
    AcWing 144. 最长异或值路径 01字典树打卡
    AcWing 143. 最大异或对 01字典树打卡
    AcWing 142. 前缀统计 字典树打卡
    AcWing 139. 回文子串的最大长度 hash打卡
    AcWing 138. 兔子与兔子 hash打卡
    常用C库函数功能及用法
    编程实现C库函数
    C语言面试题5
  • 原文地址:https://www.cnblogs.com/Jax/p/1076717.html
Copyright © 2011-2022 走看看