这次我们先初步讨论下线程的一些方法,作为基础或者说就是,出个护腕武装下自己~
1. System.Threading.Thread 类:
不管这个线程是你刻意创建的,或者是本身就存在的,比如主线程,CLR都会为每个托管线程创建一个Thread的对象来操控线程,因此我们在做开发时候可以拿到任何我们所需要的线程句柄,或者说任何线程实例对象,这是CLR干的好事,也是面向对象语言的优势。
2. thread.Join():
这个方法可能用到的会很多,一般会看到在主线程中
Thread thread1 = new Thread(dosth);
thread1.Start();
thread1.Join();
网上提到的结果比较多,其实join()的作用就是插队,将thread1直接插队到主线程中,立刻执行出结果,然后再走下去,这里要提到的是,并不是所有join都是插队到主线程,是插队到调用执行join()这句话的线程中:
dosth()
{
Thread thread2 = new Thread(dosthelse);
thread2.Start();
thread2.Join();
}
这时候我们会看到的是,thread2是被插队到thread1中,其实等价于
dosth();
dosthelse();
这样的连续调用方式。
3. .Sleep() vs .Wait()
这两个的区别,其实形象化来形容下就是:
现在有2个人,要做不同的任务,A先做,B再做,但是A做着做着睡着了,B不知道,但是他知道,我一定要等A做完了再做,于是B就一直等着...
这个现象就是.Sleep()。
而A做着做着告诉B说,我要睡一觉,你不用等我了,你可以开始做你的事了,B知道了,于是B开始做任务,A就在一边睡觉。
这个现象就是.Wait()。
那专业点的解释呢?
那就是.Sleep()不会释放锁,也就是lock,(这个我们在下一章里提),不会释放系统资源,通常说法就是占着马桶不xx。
而wait()是把线程放入线程等待池,cpu可以继续干别的事情,让他去睡吧。
4. Sleep() vs Suspend()
Suspend不会马上挂起线程,而是等线程到达安全节点后再挂起,而且suspend并不是static方法,是通过某个线程自己进行调用,因此这就带来了suspend更具有目标性的特点,你可以操控某个线程进行suspend(),然后在需要他的时候通过resume()方法将他重新调起来,
值得注意的是,wait方法对应notify,suspend对应wait,而wait是在Task命名空间中的,并不是thread,notify在C#中并不存在其实,这是java的概念了。