多线程应用方法(上)
一、进程及线程
线程与进程区别,一个应用程序必须有一个进程,但是可线程的数量却无法确定,没有线程也可能,更多使用线程也是可能的。
进程是以线程为基础。进程用来管理线程,并分配线程工作机制。
采用多线不是使软件工作得更快,而是让软件工作得更灵敏。
用VB.NET开发多线程,变得很轻松。操作更方便,管理更容易。
二、线程基本用法
定义一个类 ,首先要引用
Imports System.Threading
Public Class ClsTest
Public Sub Test()
Console.WriteLine("正在执行的主线程 {0})", _
Thread.CurrentThread.Name)
Console.Write("打印数字: ")
For i As Integer = 0 To 10
Console.Write(i & ", ")
Thread.Sleep(2000)
Next
Console.WriteLine()
End Sub
End Class
2.1、 单线程运行
Module Module1
Sub main
Dim p as new clstest
p.test
End sub
End module
此程序只有主线程在运行
2.2、两个线程运行。
Module Module1
Sub main
Dim MainThread as thread = Thread.currentThread
mainThread.Name =”First”
Console.writeline(“当前正在执行的主线程:” ,Thread.currentThread.name)
Dim SecondThread as thread = New Thread(addressof p.Exe)
SecondThread.name=”secondary”
secondThread.start
messagebox.show(“系统正在运行中…”)
end sub
End module
这个程序启动了两个线程,主线程和SecondThread线程;并且是同步工作方式(不是绝对同步工作);
2.3、多线程应用
在使用多线程访问一个类的函数成员时,必须要考虑函数执行的完整性,防止多线程访问的冲突,主要采用加线程锁。threadLock …./End Synclock
Public Class Printer
当前执行的线程:{0}", _
Thread.CurrentThread.Name)
Console.Write("打印数字: ")
For i As Integer = 0 To 10
Dim r As Random = New Random()
Thread.Sleep(100 * r.Next(10)) 异步线程测试")
Dim p As clstest = New clstest()
Dim threads(10) As Thread 定义11个线程
For i As Integer = 0 To 10
threads(i) = New Thread(AddressOf p.PrintNumbers) ‘指向相同的函数方法
threads(i).Name = String.Format("正在工作线程号:{0}", i)
threads(i).start
Next
End Sub
End Module
运行后可以看到,几乎是同时打印所有的工作;
三、带参数线程基本用法
.NET3.5对线程带参数的开发趋于更加完善。我们在开发过程中可以很好使用带参数的线程。
Class clsTest
Public mvarA As Integer
Public mvarB As Integer
Public Sub New(ByVal p1 As Integer, ByVal p2 As Integer)
mvarA = p1
mvarB = p2
End Sub
Public overides functon ToString as string
Console.writeline(mavra.tostring & mvarB.toString)
End function
End Class
在主模块中进行运行测试
Module Program
Sub Main(ByVal args As String())
Console.WriteLine("***** 带参数线程测试*****")
Console.WriteLine("主线程号: {0}", Thread.CurrentThread.ManagedThreadId)
Dim ap As clsTest = New clsTest (10, 10)
Dim t As Thread = New Thread(AddressOf Add)
t.Start(ap)
Console.ReadLine()
End Sub
Public Sub Add(ByVal data As Object)
If TypeOf data Is clsTest Then ‘判断参数类型
Console.WriteLine("ID of thread in Add(): {0}", Thread.CurrentThread.ManagedThreadId)
Dim ap As clsTest = CType(data, clsTest) ‘进行强制转换
Console.WriteLine("{0} + {1} is {2}", ap.a, ap.b, ap.a + ap.b)
End If
End Sub
End Module