.Net中的多线程编程

IT商界

  两个FOR循环能同时运行吗?

  如何实现点击一个按钮就使两个FOR循环同时运行,你想过这个问题吗?笔者在最初学习编程的时候总是在想这个问题,但是当时没人指点,过了一年才想通了这个问题。这是一个看上去很简单、实际操作却很复杂的一个编程题目。不信的话就看下面的分析。

  对于任何编程语言来说只有顺序,循环,分支3种程序的运行状态,并没有并列运行这一种方法。这时你可能会认为用两个模块,然后分别放置两个FOR循环到这两个模块中就行了。对!但是你怎么启动这两个模块呢?你可能会说在某一事件中调用它们,我猜你的代码大概是下面这样的:

  某事件

  调用过程1

  调用过程2

  过程1

  FOR……

  NEXT

  过程2

  FOR……

  NEXT

  现在可以定地说这两个FOR没有同时运行。为什么?首先调用过程1时它是执行过程1中的FOR,直到过程1的FOR执行完了才会执行过程2。所以上面的代码是错的。

  那么我们该如何解决这个看上去简单但又复杂的问题呢?──用多线程(有些资料上称为自由线程)。利用多线程技术,这个问题就可以很快解决了。在Visual Basic6.0以前是没有多线程这个概念的,要实现它我们必须使用API函数,但是其复杂程度是难以想象的,至少你要花半年的时间去看书。

  提示:这里向大家推荐一本好书《Win32编程》(一共是本本)它是微软出的。但是这本书现在已经买不到纸质版了,如果你想看的话可以到超星网站去下载,但是你必须购买它的读书卡。还有一本书是王国荣写的《Visual Basic6.0API编程》,它也可以在超星网站下载。

  不过现在好了,我们有了Visual Basic.Net,利用它提供的线程类可以很快地解决上面的问题而且无须API的知识。

  认识多线程

  首先我们对线程做个解释,但是在对线程解释前我们必须知道进程。当一个文件运行的时候,此时我们就称这个文件创建了一个进程。而线程是将这个进程分为了多个小块。最典型的一个程序是QQ,当你在发消息时,你也可以接收消息,而这两个功能并不矛盾。因为这两个程序是分别属于两个线程。但是它们是在一个进程中的。如果关闭QQ,则这两个功能也随之关闭。所以我们可以看出线程是包含在进程中的,如果没有进程则没有线程。

  在.Net中我们使用Thread 类来实现多线程的编程。但是Thread类和其他的类有一定的区别,在Thread类中的属性和方法只是基于对线程本身的操作,而不会实现这个线程的具体代码,即这个线程是做什么的。要实现线程的具体代码,即指定线程是做什么的,我们需要使用“委托”。所谓委托是面向对象函数指针的一种形式,它允许通过对函数进行引用的方法来间接地调用该函数。这句话对于多数初学者来说多半是无法理解的,为了帮助大家理解,我们可以将它解释成为:将具体所要执行的代码放置在某一模块中,在另一程序段通过指针(在Visual Basic.Net中使用“AddressOf”来代替指针的功能)来调用这一段程序。

  两个FOR循环能同时运行

  在清楚了线程和委托的概念后,我们就来看使用线程类是如何让两个FOR循环同时运行的。

  程序说明:由于在.Net中的托管必须是基于类的,所以我们要将两个带有FOR循环的过程放在一个类中,这个类是我们自己建立的。然后在窗口中添加一个Button控件,保持此控件的所有默认属性。在双击Button后出现的代码输入窗口中将两个FOR循环的过程声明为两个线程类,并且在此处启动。这样就实现了通过两个线程来同时运行两个FOR循环的效果。在下面的代码中有详细的注释。

  Public Class thfor'创建一个类,这个类包含两个过程,在这两个过程中分别包含两个循环

  Public i As Integer

  Public j As Integer

  Public Sub thfor1()

  For i = 1 To 9999

  Debug.WriteLine("i is" & i)'Debug是调试语句,它将输出的值显示在“输出”窗口中,WriteLine是表示每隔一行进行显示

  Next

  End Sub

  Public Sub thfor2()

  For j = 1 To 9999

  Debug.WriteLine("j is" & j)

  Next

  End Sub

  End Class

  双击Button控件,在代码输入窗口中输入如下语句:

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

  Dim forno As New thfor'声明我们自己建立的类,以便在后面调用类中的两个过程

  Dim thread As New System.Threadin

  g.Thread(AddressOf forno.thfor1)'通过AddressOf来引用类中的一个过程thfor1

  Dim thread2 As New System.Threadi

  ng.Thread(AddressOf forno.thfor2)'通过AddressOf来引用类中的一个过程thfor2

  thread.Start()'启动thfor1中的循环

  thread2.Start()'启动thfor2中的循环

  End Sub

  程序运行后点击Button,我们可以在“调试”窗口中看见i和j的值是交替出现的。

  总 结

  本文通过简单的代码引领大家进入.Net中线程编程之门,并且介绍了Debug的用法,因为在实际开发中Debug的使用是很频繁的。线程的编程有广泛的应用领域,比如Outlook XP在我们接收邮件的时候,如果你有多个账户,它会同时进行连接这几个账户。另外对于本例来说i和j的值是交叉出现的,原因是因为笔者的计算机只用了一个CPU,而单CPU实现多进程时实际上是采用的分时处理原理,即在一个时间片中只处理一个线程,当这个时间片用完而这个线程又没有处理完,那么将这个线程的数据保留在内存中。接着处理另一个线程。周而复始直到完成线程的处理。所以要想实现正真的多线程还必须有多个CPU。