为了以后忘记以后可以再看,所以记录下.
主线程
程序开始后将有一个主线程,即
Thread.CurrentThread
一个简单的示例,阻塞当前线程
class Program { static void Main(string[] args) { Console.WriteLine(DateTime.Now); Thread.Sleep(5000); Console.WriteLine(DateTime.Now); } }
创建一个线程
public class Demo1 { private Thread thread1; private Thread thread2; public Demo1() { thread1 = new Thread(new ThreadStart(Task1)); thread2 = new Thread(new ThreadStart(Task2)); thread1.Start(); thread2.Start(); } public void Task1() { Console.WriteLine("Code By Developer"); } public void Task2() { Console.WriteLine("Test By Tester"); } }
这里创建了2个线程,然后调用Start方法启动线程.
阻塞内部线程(非主线程)
修改上面程序,阻塞第1个线程
public void Task1() { Console.WriteLine(DateTime.Now); Thread.Sleep(5000); Console.WriteLine(DateTime.Now); Console.WriteLine("Code By Developer"); } public void Task2() { Console.WriteLine("Test By Tester"); }
可以看到两个线程互不影响
为什么要使用线程
我想能不用线程就不要用,因为线程很复杂.凡事复杂的东西均隐藏在背后,一切都是为了让客户感受到更加简单。
Windows操作系统是多进程了,为什么要多进程?那么你可以一边上网,一边听歌,一边聊天。否则这3件事情你只能选择1个。你愿意怎么样的方式?
多线程也是一样,想象一下,很少人看到公司老板在写程序吧?
老板犹如公司的主程序一般,他忙不过来,必须把任务分担出去,让某某人编码,让某某人搞测试,一个公司的运作就犹如一个程序。
人是怎么做事的
若有3件事1个人的话,只能一件一件事做,无法分身。
若有3件事3个人的话,那么可以1个人做1件事。人多好办事。
OK,先不要想的太复杂,都是可以以现实生活来表达呢。抛弃难懂的理论。
线程优先级
假设你到一家餐馆,厨师负责烧菜,营业员负责端菜。营业员就端不了菜。那么厨师烧菜的优先级就要比较高.
其实比较常见的就是我们下载电影时,你肯定会挑你喜欢的看优先下载的,同时也会开着其他下载
示例代码如下
public class Demo1 { private Thread thread1; private Thread thread2; public Demo1() { thread1 = new Thread(new ThreadStart(Task1)); thread2 = new Thread(new ThreadStart(Task2)); thread1.Priority = ThreadPriority.Highest; thread2.Start(); thread1.Start(); } public void Task1() { for (int i = 0; i < 10; i++) { Console.WriteLine("Download Moive"); } } public void Task2() { for (int i = 0; i < 10; i++) { Console.WriteLine("Download Book"); } } }
结果,虽然第2个线程先开始启动,但还是第1个线程的任务先完成,当然设置不同线程的优先级效果会不同
挂起(Suspend)和恢复(Resume)线程
- 你在工作的时候,在以下情况下会停下手头的工作,比如中午吃饭,上厕所.完事以后则以后回来工作.
- 老板有其他工作给你做,你必须把手头工作停下,完成后继续做原先的事
总而言之需要停下当前工作,之后恢复,示例如下
private Thread thread1; public Demo1() { thread1 = new Thread(new ThreadStart(Task1)); thread1.Start(); thread1.Suspend(); Console.WriteLine("Stop"); Thread.Sleep(1000); Console.WriteLine("Begin"); thread1.Resume(); } public void Task1() { Console.WriteLine("Working"); }
结果