日期:2014-05-18  浏览次数:20996 次

在何时用线程。在什么情况下用多线程。
如题,最近想把关于线程的知识点都总结下,对这个地方平时应用不是很多所以想加强理解下,望大家指教!

------解决方案--------------------
多线程,主要是想提高程序的可伸缩性。例如,有很多任务需要并行进行,那么可能需要多线程。
多线程实际上是一个假象,就是说,因为CPU的时间总是有限的,那么CPU需要频繁地切换,在某个时间执行某个线程的任务。这种情况,如果用的不好,反而增加了CPU的负担,降低了系统性能。
直接创建Thread对象,并且调用它的Start方法
使用ThreadPool.QueueUserWorkItem方法
使用BackgroundWorker
http://topic.csdn.net/u/20091028/15/eb44529f-74f5-4d1b-845f-d1ce4d697679.html
------解决方案--------------------
什么是线程?
线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。

什么是多线程?
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

多线程的好处:
可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。 

多线程的不利方面:
线程也是程序,所以线程需要占用内存,线程越多占用内存也越多; 
多线程需要协调和管理,所以需要CPU时间跟踪线程; 
线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
线程太多会导致控制太复杂,最终可能造成很多Bug;

接下来将对C#编程中的多线程机制进行探讨。为了省去创建GUI那些繁琐的步骤,更清晰地逼近线程的本质,接下来的所有程序都是控制台程序,程序最后的Console.ReadLine()是为了使程序中途停下来,以便看清楚执行过程中的输出。 

任何程序在执行时,至少有一个主线程。


C#多线程学习
http://www.cnblogs.com/xugang/archive/2008/04/06/1138856.html

我觉得上面这篇文章写得不错,关于线程说的比较入门的系列讲座

楼主可以收藏一下。





------解决方案--------------------
http://hi.baidu.com/ecentury/blog/item/09a181d4302bef0aa08bb771.html
------解决方案--------------------
程序工作分为默认阻塞 和主动阻塞。

主动阻塞:thread.sleep(1000) //主动阻塞1000毫秒。

如果当前只有1个线程,那么这个程序就在这里干等1秒钟。 白白浪费CPU时间。但是,通常情况我们写这样的代码的目的并不是为了让CPU去干等。等待1秒的目的是1个线程的while循环的结束,让其释放点资源给其他线程使用。

默认阻塞:当你在操作数据库的时候 //这个时候,操作未完成,数据库需要运算。如果需要1000毫秒,那么你就要等待1000毫秒。如果这个时候你的程序就只有可怜的1跟线程,那么很可怕....你的程序的效率将会很低,cpu在那干等,什么事情都没干。 这个时候你可以考虑适当增加线程,把数据库操作 和 其他操作的线程分割开来,以免数据库把你的程序默认阻塞的时候 让你白白的干等。

默认阻塞还包含以下情况:

做网络通信的时候的通信等待,I/O操作时候的操作等待,大量数据运算时候的运算等待,等等等等,这类操作通常都单启动n个线程去执行(当然,前提是满足需要的情况下尽可能减少线程),以错开系统瓶颈,让A,B,C 3件事情并行执行。而并行执行并不意味
---------------------------------
这是应用场景.

具体到应用上其实最麻烦的不是 什么时候该用,而是对公共数据操作的同步问题,这个是多线程编程比较难的地方
------解决方案--------------------
程序工作分为默认阻塞 和主动阻塞。

主动阻塞:thread.sleep(1000) //主动阻塞1000毫秒。

如果当前只有1个线程,那么这个程序就在这里干等1秒钟。 白白浪费CPU时间。但是,通常情况我们写这样的代码的目的并不是为了让CPU去干等。等待1秒的目的是1个线程的while循环的结束,让其释放点资源给其他线程使用。

默认阻塞:当你在操作数据库的时候 //这个时候,操作未完成,数据库需要运算。如果需要1000毫秒,那么你就要等待1000毫秒。如果这个时候你的程序就只有可怜的1跟线程,那么很可怕....你的程序的效率将会很低,cpu在那干等,什么事情都没干。 这个时候你可以考虑适当增加线程,把数据库操作 和 其他操作的线程分割开来,以免数据库把你的程序默认阻塞的时候 让你白白的干等。

默认阻塞还包含以下情况:

做网络通信的时候的通信等待,I/O操作时候的操作等待,大量数据运算时候的运算等待,等等等等,这类操作通常都单启动n个线程去执行(当然,前提是满足需要的情况下尽可能减少线程),以错开系统瓶颈,让A,B,C 3件事情并行执行。而并行执行并不意味
---------------------------------
这是应用场景.

具体到应用上其实最麻烦的不是 什么时候该用,而是对公共数据操作的同步问题,这个是多线程编程比较难的地方
------解决方案--------------------
多线程的好处之一是把许多有单独意义的事件独立处理。通过一定的优先级进行分别处理,所有的线程都是由CPU处理的,线程间通过优先级申请CPU处理。
线程应用主要在非阻塞式系统中,这个可以联想到统筹学。举个小例子理解吧:(临时想的,可能不是非常恰当,希望可以大概说明下意思)
比如CPU相当于一个人,线程要处理许多事务,比如要洗碗,烧水,煮饭,切菜等等。在烧水的时候,人可以腾出手来切菜,这时烧水和切菜就是同时进行的两个线程了,有些线程有先