• 关于多线程学习总结(三) 线程简单基本操作


    前传

    这几天来到上海,身心疲惫,而且烧钱一大把,吃饭、住房、生活用品......,我那个心痛,昨天终于安顿下来,今天是到公司报道的第一天,没做什么,一直在会议室,到了半下午的时候发给我们入职信息表,说合同现在在总部需要寄过来填写等等,然后这一天就这么过去了。还有且说今天来的实习生10个就有8个本科生,压力山大、、、

    好吧,废话少说,听多了影响心情与激情,哈哈哈哈哈

    简单的线程

    顺便说一句,小弟是学习.net的,所以对C#比较了解些,所以后面的介绍皆以C#来举例

    Main函数

    我们都知道,在任何一个程序中一般都有一个主函数(在C中是main,在C#中是Main),这就是熟称的程序入口,所有线程都依附于主函数Main(),起始线程也可以称之为主线程。如果所有的前台线程都停止,主线程就可终止,同时后台线程将无条件终止。

     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             //Console.WriteLine("测试我的线程开始");
     6 
     7             Thread test = new Thread(new ThreadStart(myThread));
     8             test.IsBackground = true;
     9             test.Start();
    10             
    11             Console.WriteLine("结束");
    12             Console.ReadKey();
    13         }
    14 
    15         public static void myThread()
    16         {
    17             Console.WriteLine("我的线程1");
    18             Console.ReadKey();      //加这一句和不加这一句区别
    19             Thread.Sleep(5000);     //暂停5秒
    20             Console.WriteLine("我的线程2");
    21         }
    22     }

    执行效果(左图加Console.ReadKey(),右图不加):

    PS:后台线程必须受制于前台线程,当主线程结束所有后台线程必须结束,例如我们聊天软件,我们关闭聊天软件那么软件就木有检查谁谁上线下线了。通常,后台线程非常适合于完成后台任务,应该将被动侦听活动的线程设置为后台线程,而将负责发送数据的线程设置为前台线程,这样,在所有的数据发送完毕之前该线程不会被终止

    关于优先级

    是不是听着特别熟悉,对操作系统有了解的园友对这个肯定木有问题,所谓优先级就是在windows上执行的线程在执行了一定时间(一个时间片)后,windows将会进行“调度”,给线程指定优先级,可以影响这个调度。例如现在有一系列的线程,他们的优先级是1,2,4,6,7,那么这个时候操作系统就会优先调用优先级为7的线程,以保证重要的作业可以优先执行(这种调度有时不好,可能导致优先级低的永远都执行不了),看一下C#代码:

     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Console.WriteLine("测试我的线程开始");
     6 
     7             Thread test1 = new Thread(new ThreadStart(myThread1));
     8             test1.Priority = ThreadPriority.Lowest;
     9             test1.Start();
    10 
    11             Thread test2 = new Thread(new ThreadStart(myThread2));
    12             test1.Priority = ThreadPriority.Highest;
    13             test2.Start();
    14 
    15             Thread test3 = new Thread(new ThreadStart(myThread3));
    16             test1.Priority = ThreadPriority.Normal;
    17             test3.Start();
    18             
    19             Console.WriteLine("结束");
    20             Console.ReadKey();
    21         }
    22 
    23         public static void myThread1()
    24         {
    25             Console.WriteLine("我的线程1");
    26         }
    27         public static void myThread2()
    28         {
    29             Console.WriteLine("我的线程2");
    30         }
    31         public static void myThread3()
    32         {
    33             Console.WriteLine("我的线程3");
    34         }
    35     }

    看运行结果后总结:

    嘿嘿,看到木有,在我的代码中,1,2,3本来是依次调用,但是执行的时候出现了变化,原因是我设置了线程的优先级

    Priority是Thread类的属性,主要是影响线程的优先级,提示一个枚举类型的值,优先级排列如下:Highest > AboveNormal >  Normal >  BelowNormal > Lowest,不过建议不要随便设置优先级,不然容易造成死锁哦。

    后记

    今天学的蛮少滴,这几天身心疲惫,今天终于进入公司,被分到解决方案事业部,接下来还会有一些基础知识方面的培训,得好好努力了,今天就到这里吧,大神见笑了,嘿嘿嘿嘿嘿、、、

    ------如果你觉得此文对你有所帮助,别忘了点击下右下角的推荐咯,谢谢!------

  • 相关阅读:
    一只简单的网络爬虫(基于linux C/C++)————Url处理以及使用libevent进行DNS解析
    一只简单的网络爬虫(基于linux C/C++)————浅谈并发(IO复用)模型
    一只简单的网络爬虫(基于linux C/C++)————支持动态模块加载
    一只简单的网络爬虫(基于linux C/C++)————守护进程
    培训班出身的程序员怎么了
    【技术人成长】知识铺
    几篇QEMU/KVM代码分析文章
    用callgraph生成的两张函数调用关系图
    Qemu对x86静态内存布局的模拟
    KVM技术
  • 原文地址:https://www.cnblogs.com/vchenpeng/p/3194522.html
Copyright © 2020-2023  润新知