进程学习:基础篇(一)
参考文章来源:http://www.cnblogs.com/csdbfans/p/3515529.html
多线程为什么这么受青睐。这点大家都懂,因为现在的电脑是多核的CPU。对于CPU来讲,它的运行速度是很快的,但是其它设备的执行速度就很慢。就像短路运动接力一样,一个人再快,其它几个人不快也是白搭。所以对于单核CPU来讲的话,多线程可能还不能完全发挥功力。但是对于多核CPU来讲,那就不同了。多线程可以更有效地利用CPU资源,从而达到高效的目的。因为使用多线程技术,可以榨取CPU的休息(等待)时间。
先看一个简单案例
static void Main(string[] args) { string content = "百川东到海,何时复西归?少壮不努力,老大徒伤悲。"; Thread firstThread = new Thread(new ParameterizedThreadStart(Read)); Thread lastThread = new Thread(new ParameterizedThreadStart(Read)); StudentInfo firstData = new StudentInfo(); firstData.Name = "开始"; firstData.Content = content.Substring(0,12); StudentInfo lastData = new StudentInfo(); lastData.Name = "最后"; lastData.Content = content.Substring(12,12); Console.WriteLine(System.DateTime.Now); firstThread.Start(firstData); lastThread.Start(lastData); firstThread.Join(); lastThread.Join();//阻塞调用线程,直到某个线程终止为止。 Console.WriteLine("处理完成,手工"); firstThread.Abort(); lastThread.Abort(); Console.ReadLine(); } public static void Read(object data) { StudentInfo model = data as StudentInfo; if (model != null) { if (model.Name == "开始")//if (model.Name != "开始") { Thread.Sleep(6000); Console.WriteLine("线程的时间" + System.DateTime.Now+"6000"); } else { Thread.Sleep(2000); Console.WriteLine("线程的时间" + System.DateTime.Now+"2000"); } //将当前线程柱塞2s Console.WriteLine(string.Format("Thread Name[{0}],Content[{1}]",model.Name,model.Content)); } } public class StudentInfo { public string Name { get; set; } public string Content { get; set; } }
经过调试过后得到的结果:
1、主线程就是线程及线程方法之外的代码。也可说Main方法就是主线程,fisrtThread和lastThread是两个并列的子线程
2、如果两个线程都调用了Join()方法(等待时间过后才会继续执行join()后面的方法当然,两个线程join()不在意谁先谁后),不分先后,而是同步执行,如果都不调用join()方法,那么并不是线程没有被调用,而是主线程没有等待子线程的等待时间,也就是先于子线程后面的代码将线程关闭的原因。(实际在调试过程中,你会发现执行了start()方法后,必须要在Abort();方法处停留足够的时间才能出来数据,至于为啥是全部出来和部分出来并不了解)
关于上面的实例,主要是介绍几个常用的多线程方法,方法都是在System.Threading这个命名空间当中。
1、【public Thread(ThreadStart start)】
多线程Thread类的构造函数,实例化这个类,即可创建一个多线程的实例。构造函数中的System.Threading.ThreadStart是一个委托,它表示此线程开始执行时要调用的方法。这里要调用的方法不可以有参数。
2、【public Thread(ParameterizedThreadStart start)】
多线程Thread类的构造函数,实例化这个类,即可创建一个多线程的实例。构造函数中的System.Threading.ParameterizedThreadStart 是一个委托,它表示此线程开始执行时要调用的方法。这里要调用的方法只能带一个参数。
3、【public static void Sleep(int millisecondsTimeout)】
多线程类调用这个方法,可以将当前线程挂起指定的时间。这是Thread类的静态方法,使用比较简单,只需要Thread.Sleep(毫秒时间)。
4、【public void Start()】
多线程类调用这个方法,即意味着这个多线程正式启动。调用这个方法,则意味着传递到多线程类的构造函数的委托是没有参数,即是使用System.Threading.ThreadStart的委托
5【public void Start(object parameter)】
多线程类调用这个方法,即意味着这个多线程正式启动。调用这个方法,则意味着传递到多线程类的构造函数的委托是需要参数的,即是使用System.Threading.ParameterizedThreadStart的委托
6、【public void Join()】
多线程调用这个方法,即意味着在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,直到某个线程终止为止。说白了,就是调用这个方法的多线程之后要执行的指令需要等调用的多线程完成之后才能继续执行。
对于上面的例子来讲,由于两个线程firstThread和lastThread都调用了Join()方法。所以Console.WriteLine("处理完成,收工!");需要等两个线程firstThread和lastThread执行完成后,才能继续执行下面的指令。
7、【public void Abort()】
多线程调用这个方法,即可终止线程。
推荐的文章 http://www.cnblogs.com/miniwiki/archive/2010/06/18/1760540.html 这个更全面更简单理解
翻译全文(更加全面的信息):https://blog.gkarch.com/threading/part1.html