代码改变世界

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

2013-07-16 22:25  昨日书  阅读(1719)  评论(10编辑  收藏  举报

前传

这几天来到上海,身心疲惫,而且烧钱一大把,吃饭、住房、生活用品......,我那个心痛,昨天终于安顿下来,今天是到公司报道的第一天,没做什么,一直在会议室,到了半下午的时候发给我们入职信息表,说合同现在在总部需要寄过来填写等等,然后这一天就这么过去了。还有且说今天来的实习生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,不过建议不要随便设置优先级,不然容易造成死锁哦。

后记

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

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