多线程编程实战(一)
多线程编程实战(一)
为了快速处理大量的任务,多线程编程必不可少,所以最近也开始研究多线程方面的东西了。网上有不少资料可以参考,自己从实例入手,总结了一些东西,把它记录下来,方便自己日后查阅,也方便后来人。现在的编程语言,入门第一课,都是写一个Hello Word的程序。本文类似,虽说不是hello Word,但也是从最简单的多线程实例入手。
我们最常用到多线程的场景一般是这样的,有一个很大的任务需要处理,而这个大的任务有可以细分为许多的小任务(子任务),这些小任务可以采用多线程机制,并行执行。而一般来说,这个大任务所包含的小任务的个数可能不是太确定。
根据以上场景,我们对其进行归纳:
1. 一个大任务,内部包含了数量不定的子任务
2. 需要对子任务进行多线程处理
OK, 下面我们开始着手用C#实现对此实例的多线程实现。我的解决方案是:
1. 对象化大任务,在初始化大任务的实例(Instance)时,初始化(确定)子任务
2. 采用多线程,调用(Invoke)大任务的实例(Instance)中定义的处理子任务的方法
3. 多线程处理子任务时,定义一个全局的标志,记录但前处理到了哪一个,保证不重复处理子任务;
基于此方案,我们的“大任务”类如下:
外部多线程实现如下:
在Console模式下,其结果显示如下:
由此可见,线程3、4、5、6共4个线程一起处理了这些子任务。代码不是很复杂,只做简单说明:
1. 默认的命名空间为System.Threading, 线程相关的东西都在这个namespace下;
2. new Random((int)DateTime.Now.Ticks).Next(30, 50):初始化一个随机数的实例(instance),然后生产一个在30到50之间的随机数。这里的目的是假设我们在初始化任务实例时,不确定子任务的个数。后面还有new Random((int)DateTime.Now.Ticks).Next(100, 300),目的是架设处理子任务的时间在100到300毫秒之间不定
3. Thread th = new Thread(new ThreadStart(tester.TestOutput));
th.Start(); 这两句可是线程编程的核心,即初始化一个线程实例,然后开始执行!
4. Thread.CurrentThread.GetHashCode():这个可以返回线程的一个哈希值(HashCode),此例中没有实际意义,只用于区分不同的线程
5. private int flag = 0:作为一个标记使用,记录但前执行到那个子任务了。各个子线程均能够访问到。
6. public int MaxOutPut:记录总的任务数。
Console.Write(“Hello Word”) J 一个简单的多线程实例就是这么easy,当然,这只是最简单、最初步的一个实例,还有很多需要注意、优化的东西,也有一些bug,我们下文接着说。
..待续..