标签:
一)进程和线程的概念
通俗的将,一个进程就是我们的一个应用程序。例如在cmd命令行中输入calc命令就会打开windows的计算器。在任务管理器中就可以看到一个名为calc的进程正在运行。如下图:
而一个进程中,可以运行多个线程,线程是我们程序的最小单元。一个线程“寄生”在进程中,它完成一个单独的任务。进程中有了多线程,可以让其在同一时间执行多个任务,提高程序运行效率。
二)多线程的优缺点。
优点:多线程可以同时执行多个任务,提高工作效率。特别是可以让多线程去执行I/0相关的操作,这样主线程就可以继续执行,从而不会阻塞。
缺点:多线程只有在多核CUP的系统中才能体现出优势。因为进程中运行多线程,系统在不同线程中切换需要一定的时间和资源开销。如果是单核CUP,使用多线程反而会因为线程切换而导致更低的效率。同时,多线程要涉及到资源共享、代码不易编写、调试等问题。所以在不需要多线程的时候尽量不要使用多线程。
三).NET多线程代码实例
使用多线程,需要引入using System.Threading;命名空间。使用Thread类实例化一个线程对象,然后调用Start()重载方法开启线程。
1)多线程运行无参数的函数。
static void Main(string[] args) { Thread worker = new Thread(PrintAllList); worker.Start(); } public static void PrintAllList() { for (int i = 0; i < 10; i++) { Console.Write(i + " "); } Console.WriteLine(); }
2)多线程运行有参数函数
static void Main(string[] args) { Thread worker = new Thread(PrintAllList); worker.Start(4); } public static void PrintAllList(object target) { for (int i = 0; i < (int)target; i++) { Console.Write(i + " "); } Console.WriteLine(); }
通过实例化一个Thread实例,可以生成一个线程,然后通过Thread的构造函数传入一个要执行的函数名。这样做实际上是让系统新开启一个线程,让这个新开启的线程去执行函数名所对应的代码,从而让主线程不被阻塞能够继续执行。
这里要注意,在向多线程的构造函数中传入的函数时,该函数的参数类型必须为object,否则会有编译错误。既然如此,如何才能保证我们新开启的线程所运行的函数代码能够使用特定类型的参数呢?也就是说,如果我向worker.Start(4)写成了worker.Start("hello"),我们上面的例子就会有运行时错误。如何才能避免?答案是,我们可以通过一个包装类,将PrintAllList函数写在包装类里面。在该包装类的构造函数中传入参数,从何就保证了编译时类型安全检查。代码如下:
class Program { static void Main(string[] args) { PrintWarpper printWarpper = new PrintWarpper(5); //PrintWarpper printWarpper = new PrintWarpper("hello"); Thread worker = new Thread(printWarpper.PrintAllList); worker.Start(); } } class PrintWarpper { private int _target; public PrintWarpper(int _target) { this._target = _target; } public void PrintAllList() { for (int i = 0; i < this._target; i++) { Console.Write(i + " "); } Console.WriteLine(); } }
上面的代码就实现了在编译时的类型安全检查。如果我们将PrintWapper的构造函数中传入字符串(如注释行代码),那么在编译时我们就能发现错误了。
标签:
原文地址:http://www.cnblogs.com/kuillldan/p/5077148.html