zoukankan      html  css  js  c++  java
  • 01-多线程及异步委托

    一、多线程:

    1、概念:

    线程:是Windows任务调度的最小单位。线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
    多线程:是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务(代码),也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。 
     
    2、为什么要用多线程:
    ①让计算机"同时"做多件事情,节约时间。
    ②多线程可以让一个程序“同时”处理多个事情。
    ③后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况。
     
    3、产生一个线程的4步骤:
    编写产生线程所要执行的方法
    引用System.Threading命名空间
    实例化Thread类,并传入一个指向线程所要运行方法的委托。(这时候这个线程已经产生,但是还没有运行)
    调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定。
     
    4、.net中如何实现多线程:
    线程肯定也是要执行一段代码的。所以要产生一个线程,必须先为该线程写一个方法,这个方法中的代码就是该线程运行所要执行的代码。(找个人来做一件事情)
    线程启动时,通过委托调用该方法。(委托的好处)

    (线程启动时,调用传过来的委托,委托就会执行相应的方法,实现线程执行方法)

    案例代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    
    namespace _07多线程
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("主线程 {0} 正在执行中...", Thread.CurrentThread.ManagedThreadId);
    
                #region 线程
                //ThreadStart 无参无返回值的委托
                Thread thread = new Thread(ShowMsg);//新开启一个线程执行一个方法
                //建议操作系统把当前线程搞成高级别
                thread.Priority = ThreadPriority.Highest;
                //给开发人员用,来识别不同的线程
                thread.Name = "zy";
                //后台线程: 如果所有的前台线程都退出了,那么后台线程自动被关闭
                thread.IsBackground = true;
                thread.Start();//并没有执行,告诉操作系统准备就绪
                //thread.Abort();//关闭线程
                Console.ReadKey();       
                #endregion
    
            }
    
            static void ShowMsg()
            {
                Console.WriteLine("工作线程 {0} 执行中...",Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(2000);
            }
        }
    }
    View Code

    运行截图:

    5、Thread类的一些重要成员:

    Start()启动线程
    Abort()终止线程
    Thread.Sleep(1) 静态方法,可以使当前线程停止一段时间运行
    Name线程名
    Thread.CurrentThread获得当前的线程引用
     
    -----------------------------------------------------------------------------------
    二、委托的异步调用:
    1、了解一下几点:
    BeginInvoke  异步调用
    EndInvoke     获取异步调用的(方法)返回值
    IAsyncResult  异步操作的状态
    AsyncResult   异步操作的结果(可以获取当前执行的委托对象)
    using System.Runtime.Remoting.Messaging;
    注意:委托的异步调用只对单播委托
     
    案例代码:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Runtime.Remoting.Messaging;
    
    namespace _07多线程
    {
        public delegate int AddDel(int a,int b);//声明一个有参数有返回值的委托
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("主线程 {0} 正在执行中...", Thread.CurrentThread.ManagedThreadId);
    
                AddDel addDel = new AddDel(AddFunc);
    
                //1.同步调用
                //int c = addDel(1, 2);
    
                //2.无回调函数的异步调用
                //启动委托指向的方法来执行,具体由线程池提供一个线程来执行当前的委托指向的方法
                //IAsyncResult ascResult = addDel.BeginInvoke(1, 2, null, null);
                //while (!ascResult.IsCompleted)
                //{ 
                //    //主线程执行的其他操作
                //}
                ////此EndInvoke方法会阻塞当前线程。直到委托方法执行完毕后,
                ////并将返回值交给result后,继续执行后面的代码
                //int result = addDel.EndInvoke(ascResult);
                //Console.WriteLine(result);//3
                //Console.ReadKey();
    
                //3.有回调函数的异步调用
                IAsyncResult ascResult = addDel.BeginInvoke(1, 2, MyDelCallBack, 3);
    
                //主线程可继续执行其他操作
                Console.WriteLine("===========");
                Console.ReadKey();
            }
    
            static int AddFunc(int a, int b)
            {
                Console.WriteLine("AddFunc工作线程运行中...{0}", Thread.CurrentThread.ManagedThreadId);
                //Thread.Sleep(1000);
                return a + b;
            }
    
            //异步委托执行完成了的回调函数
            public static void MyDelCallBack(IAsyncResult result)
            {
                //把接口类型转换成实例类型
                AsyncResult aResult = (AsyncResult)result;
    
                //转换成我们自己的委托类型
                AddDel del = (AddDel)aResult.AsyncDelegate;
    
                //执行完成获取执行的结果
                int addResult = del.EndInvoke(result);
                int state = (int)aResult.AsyncState;//3
    
                Console.WriteLine("异步完成的回调方法执行的结果是:{0} @{1}", addResult, Thread.CurrentThread.ManagedThreadId);
            }
        }   
    }
    View Code

    运行截图:

    执行步骤:

    ①从线程池里获取一个线程。

    ②执行委托指向的方法(在工作线程里面执行)

    ③调用回调函数(如果是null不执行)。

     
  • 相关阅读:
    5月9日黑马java之java中四种权限修饰符
    MOOCjava之输入输出
    5月7日黑马java之final关键字的用法
    MOOCjava之数据库基础
    MOOCjava之线程
    毕业设计
    shiro 权限
    Spring Boot Thymeleaf
    Spring Boot文件处理
    Spring Boot Rest模板
  • 原文地址:https://www.cnblogs.com/zy-style/p/4335486.html
Copyright © 2011-2022 走看看