• 【多线程】-Thread


    Thread介绍(实例化):

    Thread类可以创建和控制线程,Thread类的构造函数重载为接受ThreadStart和ParameterizedThreadStart类型的委托参数。微软官网给出的构造函数解释是:
    1.Thread(ParameterizedThreadStart):初始化 Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托--------带参数。
    2.Thread(ThreadStart):初始化 Thread 类的新实例------不带参数。
    在c#中使用可以不予区分,我们只需要实例化即可,c#会自动给我们调用相应构造函数。所以我们不必关系这两个函数。我们简单创建一个例子:

     static void Main(string[] args)
            {
                Console.WriteLine("主线程开始");
                //IsBackground=true,将其设置为后台线程
                Thread t = new Thread(Run) { IsBackground = true };
                t.Start();
                Console.WriteLine("主线程继续执行!");
                //主线程结束,后台线程会自动结束,不管有没有执行完成
                //Thread.Sleep(300);
                Thread.Sleep(1500);
                Console.WriteLine("主线程结束");
                Console.ReadKey();
            }
            static void Run()
            {
                Thread.Sleep(700);
                Console.WriteLine("这是后台线程调用");
            }
    
    输出结果: ![](http://images2017.cnblogs.com/blog/809005/201709/809005-20170908161143507-591757704.png) 从上面我们可以看出主线程没有等待线程方法执行结束,而是继续执行。 在这里我要补充的一点是如果把上面代码中的休眠去除会导致产生的结果不一样,这个问题是因为线程执行是无序的。

    Thread中的属性:

    CurrentCulture:获取或设置当前线程的区域性。(这个暂时没研究) CurrentThread:获取当前正在运行的线程。(即在当前线程内要获取所运行的线程,返回的是当前运行线程,配合其他属性来获取数据) IsAlive:获取一个值,该值指示当前线程的执行状态。(返回bool类型,如果此线程已启动并且尚未正常终止或中止返回true,否则为false) IsBackground:下面会特殊说明一下。 ManagedThreadId:获取当前托管线程的唯一标识符。(当前线程的id,返回值为int类型,代表当前线程号,配合CurrentThread使用) Name:获取或设置线程的名称。(自定义给线程设置一个标识名称,配合CurrentThread使用) ThreadState:获取一个值,该值包含当前线程的状态。(返回当前线程的状态,枚举类型) Priority:获取或设置指示线程的调度优先级的值。 # Thread中的前台后台: 在创建Thread中我们可以选中设置为前台线程或者后台线程(默认为前台进程): IsBackground 属性: 官方解释 :获取或设置一个值,该值指示某个线程是否为后台线程。 自我理解:就是设置一个true或者false,当为true时则表示为后台线程,当为false时为前台线程。 在这里不得不提的是前台线程和后台线程存在的差别,应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。即当设置为false时即使用户关闭当前主程序,进程不一定关闭,因为线程是寄托在进程上的,前台线程未退出,当前进程就不会终止。(在资源管理器中仍可以看到进程)

    Thread中的常用方法:

    我们使用Thread创建线程后,我们需要对线程进行控制。

      1、 使用Start()方法使线程处于Running状态,线程开始执行。

      2、 使用Join()方法使线程处于WaitSleepJoin状态,在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,直到某个线程终止或经过了指定时 间为止。

      3、 使用Sleep()方法,也会使线程处于WaitSleepJoin状态,在经历Sleep()方法定义的时间段后,线程就会被再次唤醒。、

      4、 使用Abort()方法,会使线程处于ResetAbort()状态,线程在接到这个命令的时候,会抛出一个ThradAbordException类型的异常。
    在上面的方法基础上我们修改一下代码来看结果:

            static void Main(string[] args)
            {
                Console.WriteLine("主线程开始");
                //IsBackground=true,将其设置为后台线程
                Thread t = new Thread(Run);
                t.Start();
                Console.WriteLine("newThread State:{0}", t.ThreadState);
                Console.WriteLine("主线程继续执行!");
                t.Join(100);
                Console.WriteLine("newThread State:{0}", t.ThreadState);
                //主线程结束,后台线程会自动结束,不管有没有执行完成
                t.Abort();
                Console.WriteLine("主线程结束");
                Console.ReadKey();
            }
            static void Run()
            {
               // Thread.Sleep(700);
                Console.WriteLine("这是后台线程调用");
            }
    

    输出结果:

    Thread中数据传递:

    上面也说了在c#中线程方法传递数据可以直接调用,下面我们就在上面方法的地方修改一下即可: t.Start(100):在启动线程的时候把需要的参数传递进去。 static void Run(object nub):方法上面加上参数,这里大家都知道就不多了。 Console.WriteLine("这是传递数据{0}",nub):最后打印一下。 直接上结果结束此文: ![](http://images2017.cnblogs.com/blog/809005/201709/809005-20170908170709804-23414876.png)
  • 相关阅读:
    去除字符串中多余空格
    day02-03 字符编码
    eclipse与myeclipse区别
    xz解压和zip解压
    yum安装
    防火墙
    查看和操作HBA卡
    复制linux虚拟机后网卡不能用的解决方法
    关闭IPv6
    更改root密码
  • 原文地址:https://www.cnblogs.com/yanbigfeg/p/7492886.html
Copyright © 2020-2023  润新知