现在的位置: 首页 > 综合 > 正文

ASP.Net 热身 之 多线程

2017年11月07日 ⁄ 综合 ⁄ 共 3194字 ⁄ 字号 评论关闭

终于该将ASP.NET了 经过前面的三层练习 为后面的ASP.NET打下了很好的基础 可以这么说 三层学不好 ASP.NET肯定也学不好
在将ASP.NET之前 老师先给我们来了个热身 讲了一下多线程和Socket 并使用多线程和Socket做了一个简单的聊天室工具
接下来的两个帖子 我分别来介绍一下多线程和Socket 还是那句老话 有不对的地方还请您指出 以便为改进 万分感谢 !!
好了 开始上笔记

线程与进程
 在应用程序运行的时候 每一个应用程序都有一个对应的进程
 进程中包含线程 每个进程中必须包含一个线程 也可以包含多个 线程是不可再分的单位

线程与多线程
 线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
 多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务(代码),也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

多线程的”并发性”
 通常我们认为如果一个程序中多个线程 那么这几个线程会同时执行(并发性),准确的来说线程之间不存在并发性 其实CPU是依次执行各个线程的 每个线程的处理时间大约是20MS(毫秒) 我们用肉眼是体会不到的 在我们看来 就是同时执行多个线程 因为CPU的处理速度太快了

多线程与多核处理器(个人理解 估计不恰当)
 多核的CPU是同时处理多个进程
 多线程是多个线程同时处理一个进程

创建一个线程 调用执行无参的方法
 // 命名空间
            using System.Threading;

 // 通过 ThreadStart 委托指定一个线程要调用的方法  showHello是进程调用的方法名
            ThreadStart thraedStar = new ThreadStart(showHello);
            // 创建一个线程
            Thread thread = new Thread(thraedStar);
            // 将线程的状态设置为可运行的状态
            thread.Start();

创建一个线程 调用执行有参的方法
 单个参数的时候
      static void Main(string[] args)
        {
            // 委托一个线程要调用的方法 调用的是一个有参的方法
            ParameterizedThreadStart parThreadStart = new ParameterizedThreadStart(showHello);
           
            // 创建线程
            Thread thread = new Thread(parThreadStart);

            // 开启线程 并且给线程参数
            thread.Start("张三");

            Console.ReadKey();
        }

        public static void showHello(object name)
        {
            Console.WriteLine("你好 {0} ", name);
        }

 多个参数的时候
  static void Main(string[] args)
        {
            // 定义一个集合 存放参数
            List<string> lis = new List<string>() { "张三", "李四", "王五" };

            // 委托一个线程要调用的方法 调用的是一个有参的方法
            ParameterizedThreadStart parThreadStart = new ParameterizedThreadStart(showHello);
           
            // 创建线程
            Thread thread = new Thread(parThreadStart);

            // 开启线程 并且给线程参数
            thread.Start(lis);

            Console.ReadKey();
        }

        public static void showHello(object names)
        {
            // 将 object names转换成集合
            List<string> lis = names as List<string>;

            // 遍历集合 输出
            for (int i = 0; i < lis.Count; i++)
            {
                Console.WriteLine("你好 {0} ", lis[i]);
            }
        }

跨线程访问
 什么是跨线程访问: 跨线程访问就是在一个线程中操作领一个线程
 在默认情况下 系统是不允许跨线程访问的 为了程序能跨线程访问 要添加以下代码
// 可以夸线程访问
            TextBox.CheckForIllegalCrossThreadCalls = false;

多线程方法重入(前提是有两个或者两个以上的线程)
 什么是方法的重入
  在A进程中执行方法FunA的时候 在FunA执行到一半的时候 B进程执行FunB 有的时候会造成程序逻辑上的混乱 为了避免这种情况发我 需要给方法添加一个 锁 为了线程的同步

 public static void showHello()
        {
            lock (this)
            {
                // 方法体
            }
        }
 执行的过程 :  当A进程执行方法的时候 B进程进来开到有Lock关键字 就会等待A进程执行完以后 B进程再执行  当Lock花括号里面的内容执行完以后 进程自动关闭

前台线程和后台线程
 前台线程: 只有所有前台线程都关闭以后 才能关闭整个应用程序(比如UI线程以后 程序还会运行)
 后台线程:只要所有的前台线程全部关闭 后天线程会自动关闭(比如只要关闭UI线程 应用程序就会结束)

 在我们创建一个线程的时候 默认情况是 前台线程
 只要添加以下代码
   ThreadStart theradStart = new ThreadStart(briage);
            Thread thread = new Thread(theradStart);
            thread.Start();
            // 设置为后台线程
            thread.IsBackground = true;
 这个线程才会变成后台线程 我们推荐在创建线程的时候设置为后台线程

线程的调度方式
 1.非抢占式调度:(用在以前的操作系统上)
 指某个线程在运行时不会被操作系统强制暂停,它可以持续地运行直至运行告一段落井主动地交出运行权。在这样的调度模式之下,线程的运行就完全是单队列的,并且可能产生恶意程序长期霸占运行权的情况。而且一旦一个程序死了,那么整个电脑就只好重启啦~~!

 2.抢占式调度:(用在现在的操作系统上)
 指每个线程都只有极少的运行时间(在Windows内核模式下这个时间不会超过20ms ),而当时间用完时该线程就会被强制暂停,保存上下文并把CPU运行权利交给下一个线程,这样调度的结果就是所有的线程都在被快速地切换运行,使得使用者感觉所有的线程在"并行"运行。

 

(作者注释:由于我的笔记是.doc格式的 所有的标题都有超链接以及标题颜色 如果直接复制过来的话会有格式不支持的情况 为了统一 我在全部转换成了txt 所以会没有颜色 希望大家见谅)

抱歉!评论已关闭.