Previous | Home | Next |
Threads are typically created when you want a program to do two things at once.
Starting Threads
The simplest way to create a thread is to create a new instance of the Thread class. The Thread constructor takes a single argument: a delegate type. The CLR provides the ThreadStart delegate class specifically for this purpose, which points to a method you designate. This allows you to construct a thread and to say to it "when you start, run this method." The ThreadStart delegate declaration is:
Public Delegate Sub ThreadStart()
Example
Imports System.Threading Public Class CreatingThread Private Shared Sub Main(args As String()) Dim MyThread As New Thread(New ThreadStart(ThreadProc)) MyThread.Start() MyThread.Join() End Sub Protected Shared Sub ThreadProcess() For i As Integer = 0 To 99 Console.WriteLine(i) Next End Sub End Class
Creating a Thread of Execution
Imports System.Threading Class MyThread Public count As Integer Private thrdName As String Public Sub New(name As String) count = 0 thrdName = name End Sub Public Sub run() Console.WriteLine(thrdName & " starting.") Do Thread.Sleep(500) Console.WriteLine("In " & thrdName & ", count is " & count) count += 1 Loop While count < 10 Console.WriteLine(thrdName & " terminating.") End Sub End Class Public Class MultiThread Public Shared Sub Main() Console.WriteLine("Main thread starting.") Dim mt As New MyThread("Child #1") Dim newThrd As New Thread(New ThreadStart(AddressOf mt.run)) newThrd.Start() Do Console.Write(".") Thread.Sleep(100) Loop While mt.count <> 10 Console.WriteLine("Main thread ending.") End Sub End Class
Joining Threads
To join thread1 (t1) onto thread2 (t2), write: t2.Join()
Joining the current thread to each thread in the collection in turn :
For Each myThread As Thread In myThreads myThread.Join() Next Console.WriteLine("All my threads are done.")
Create multiple threads of execution
Imports System.Threading Class MyThread Public count As Integer Public thrd As Thread Public Sub New(name As String) count = 0 thrd = New Thread(New ThreadStart(AddressOf Me.run)) thrd.Name = name thrd.Start() End Sub Private Sub run() Console.WriteLine(thrd.Name & " starting.") Do Thread.Sleep(500) Console.WriteLine("In " & thrd.Name & ", count is " & count) count += 1 Loop While count < 10 Console.WriteLine(thrd.Name & " terminating." End Sub End Class Public Class MoreThread Public Shared Sub Main() Console.WriteLine("Main thread starting.") Dim mt1 As New MyThread("Child #1") Dim mt2 As New MyThread("Child #2") Dim mt3 As New MyThread("Child #3") Do Console.Write(".") Thread.Sleep(100) Loop While mt1.count < 10 OrElse mt2.count < 10 OrElse mt3.count < 10 Console.WriteLine("Main thread ending.") End Sub End Class
Suspending Threads
To cause your thread to sleep for one second, you can invoke the static method of Thread, Sleep, which suspends the thread in which it is invoked
Thread.Sleep(1000)
Killing Threads
For killing a thread Abort( ) method is used. This causes a ThreadAbortException exception to be thrown, which the thread can catch, and thus provides the thread with an opportunity to clean up any resources it might have allocated.
Example for Suspending, resuming, and stopping a thread
Imports System.Threading Class MyThread Public thrd As Thread Public Sub New(name As String) thrd = New Thread(New ThreadStart(AddressOf Me.run)) thrd.Name = name thrd.Start() End Sub Private Sub run() Console.WriteLine(thrd.Name & " starting.") For i As Integer = 1 To 1000 Console.Write(i & " ") If (i Mod 10) = 0 Then Console.WriteLine() Thread.Sleep(250) End If Next Console.WriteLine(thrd.Name & " exiting.") End Sub End Class Public Class SuspendResumeStop Public Shared Sub Main() Dim mt1 As New MyThread("My Thread") Thread.Sleep(1000) ' let child thread start executing mt1.thrd.Suspend() Console.WriteLine("Suspending thread.") Thread.Sleep(1000) mt1.thrd.[Resume]() Console.WriteLine("Resuming thread.") Thread.Sleep(1000) mt1.thrd.Suspend() Console.WriteLine("Suspending thread.") Thread.Sleep(1000) mt1.thrd.[Resume]() Console.WriteLine("Resuming thread.") Thread.Sleep(1000) Console.WriteLine("Stopping thread.") mt1.thrd.Abort() mt1.thrd.Join() ' wait for thread to terminate Console.WriteLine("Main thread terminating.") End Sub End Class
Synchronization
Synchronization is provided by a lock on the object, which prevents a second thread from barging in on your object until the first thread is finished with it.
Previous | Home | Next |