In visual basic, the thread is a basic unit of execution within the process and it is responsible for executing the application logic.
By default, every application or program will carry one thread to execute the application logic and that thread is called the Main thread. So, we can say that every program or application is by default a single-threaded model.
For example, in windows operating system if we open Microsoft Excel and Word applications simultaneously, then each application process will be taken care by separate threads.
In visual basic, we need to import System.Threading
namespace in our program to work with threads. Once we import System.Threading
namespace, we can create or access the threads using Thread
class.
Generally, in visual basic when we start a program execution, the Main thread will automatically create to handle the program logic. If we create any other threads in our program by using Thread
class those will become child threads for the Main thread.
If we want to access the Main thread that is executing the current program code, we can get it by using CurrentThread
property of the Thread
class.
Following is the example of getting the main thread details using CurrentThread
property of Thread
class.
Imports System.Threading
Module Module1
Sub Main(ByVal args As String())
Dim t1 As Thread = Thread.CurrentThread
Console.WriteLine("Thread Id:{0}", t1.ManagedThreadId)
Console.WriteLine("Is Background Thread:{0}", t1.IsBackground)
Console.WriteLine("Thread Culture:{0}", t1.CurrentCulture)
Console.ReadLine()
End Sub
End Module
If you observe the above code, we imported System.Threading
namespace to get the main thread details by using CurrentThread
property of Thread
class.
When we execute the above visual basic program, we will get the result as shown below.
Thread Id:10
Is Background Thread:False
Thread Culture:en-IN
This is how we can access the main thread of our application which executing our program code based on our requirements.
In visual basic, the Main thread is responsible for executing the programming logic in a synchronous way that means one after another. In case, if we want to execute the few tasks simultaneously (asynchronous way), then we need to create the child threads in our application.
In visual basic, we can create a thread by extending the Thread
class. To create a new thread, we need to pass ThreadStart
delegate as a parameter to the Thread constructor like as shown below. Here, the parameter of ThreadStart
is the method that will be executed by the new thread.
Once the thread is created, we need to call the Start
method of Thread
class to start the execution of the newly created thread.
' Create thread
Dim t1 As Thread = New Thread(New ThreadStart(PrintInfo))
' Start newly created thread
t1.Start()
Here, PrintInfo is the method and it will be executed when we start the newly created thread. Initially, when we create a thread that will in the unstarted state, so we need to start the thread by using Start()
method.
As we discussed if we create any threads in our program by using Thread
class those will become child threads for the Main thread.
Following is the example of creating the thread in visual basic using Thread
class.
Imports System.Threading
Module Module1
Sub Main(ByVal args As String())
' Create child thread
Dim t1 As Thread = New Thread(New ThreadStart(AddressOf PrintInfo))
' Start newly created thread
t1.Start()
Console.WriteLine("Main Thread Completed")
End Sub
Private Sub PrintInfo()
For i As Integer = 1 To 4
Console.WriteLine("i value: {0}", i)
Next
Console.WriteLine("Child Thread Completed")
Console.ReadLine()
End Sub
End Module
When we execute the above program, we will get the result as shown below.
Main Thread Completed
i value: 1
i value: 2
i value: 3
i value: 4
Child Thread Completed
If you observe the above result, the Main thread and child thread started its execution simultaneously and child thread continued its execution till it finishes its task even after completion of Main thread execution.
Following table lists some of the most commonly used properties of Thread
class to work with threads in visual basic.
Property | Description |
---|---|
CurrentContext | It will return the current context in which the thread is executing. |
CurrentThread | It will return the currently running thread. |
CurrentCulture | It is useful to get or set the culture for the current thread. |
CurrentUICulture | It is useful to get or set the Resource Manager current culture to look up culture-specific resources at run time. |
IsAlive | It is useful to get the execution status of the current thread. |
IsBackground | It is useful to get or set a value which indicates whether the thread is background thread or not. |
IsThreadPoolThread | It will return a value that indicates whether the thread belongs to the managed thread pool or not. |
ManagedThreadId | It will return the unique identifier of the currently managed thread. |
Name | It is useful to get or set the name of the thread. |
Priority | We can get or set a value that indicates the scheduling priority of a thread. |
ThreadState | It is useful to get the state of the current thread. |
Following table lists some of the most commonly used methods of Thread
class to work with threads in visual basic.
Method | Description |
---|---|
Abort() | This method is useful to terminate the thread. |
AllocateDataSlot() | It will allocate an unnamed data slot on all the threads. |
AllocateNamedDataSlot() | It will allocate a named data slot on all threads. |
BeginThreadAffinity() | It will notify a host that the managed code is about to execute the instructions that depend on the identity of the current physical operating system thread. |
EndThreadAffinity() | It will notify a host that the managed code has finished executing the instructions that depend on the identity of the current physical operating system thread. |
Equals() | It will determine whether the specified object is equal to the current object or not. |
Finalize() | It will ensure that the resources are freed and other cleanup operations are performed when the garbage collector reclaims the Thread object. |
GetData() | It is useful to retrieve the value from the specified slot on the current thread. |
GetDomain() | It will return the current domain in which the current thread is running. |
GetHashCode() | It will return the hash code of the current thread. |
GetType() | It will return the type of current instance. |
Interrupt() | It will interrupt a thread that is in the WaitSleepJoin thread state. |
Join() | It will make the thread to finish its work or it will halt other threads until it finishes work. |
Resume() | It will resumes a thread that has been suspended. |
Sleep() | It will suspend the current thread for a specified amount of time. |
Start() | It will instruct the operating system to change the state of current instance to Running. |
Suspend() | It will suspend the thread. |
VolatileRead() | It will read the value of a field and that value is the latest written by any processor in a computer. |
VolatileWrite() | It will write a value to the field immediately so that the value will be visible for all processors in the computer. |
Yield() | It will yield the execution to another thread that is ready to run on the current processor. |
In visual basic, each thread will have a life cycle and it will start when we create an instance of object using Thread
class. Once the task execution of thread is completed, then the life cycle of thread will get end.
At any point of time, the thread in visual basic will exists in any one of the following states.
State | Description |
---|---|
Unstarted | When we create the thread that will be in unstarted state. |
Runnable | When we call the Start() method, the thread will be moved to ready to run or runnable state. |
Running | It indicates that the thread is in running state. |
Not Runnable | If thread is in not runnable state means there is a chance that the Sleep() or Wait() or Suspend() method is called on the thread or blocked by I/O operations. |
Dead | If thread is in dead state means the thread completes its task execution or it is aborted. |
Following is the example of knowing the lifecycle and states of thread in visual basic.
Imports System.Threading
Module Module1
Sub Main(ByVal args As String())
' Create child thread
Dim t1 As Thread = New Thread(New ThreadStart(AddressOf PrintInfo))
Console.WriteLine("Thread State: {0}", t1.ThreadState)
' Start newly created thread
t1.Start()
Console.WriteLine("Thread State: {0}", t1.ThreadState)
' Suspend thread
t1.Suspend()
Console.WriteLine("Thread State: {0}", t1.ThreadState)
' Resume thread to running state
t1.[Resume]()
Console.WriteLine("Thread State: {0}", t1.ThreadState)
Console.ReadLine()
End Sub
Private Sub PrintInfo()
Console.WriteLine("Method Execution")
End Sub
End Module
If you observe the above example, we used ThreadState
property of Thread
class to know the state of thread and we used Start()
, Suspend()
, and Resume()
methods of Thread
class to start, suspend and resume the execution of a thread.
When we execute the above program, we will get the result as shown below.
Thread State: Unstarted
Thread State: Running
Thread State: Suspended
Thread State: Running
Method Execution
This is how we can change or vary the thread states in our application based on requirements.
Following is the example of managing the thread by using various methods of Thread
class.
Imports System.Threading
Module Module1
Sub Main(ByVal args As String())
Dim sw As Stopwatch = New Stopwatch()
sw.Start()
Dim t1 As Thread = New Thread(New ThreadStart(AddressOf PrintInfo))
t1.Start()
' Halt the execution till thread execution completed
t1.Join()
sw.[Stop]()
Dim ts As TimeSpan = sw.Elapsed
Dim et As String = String.Format("{0}:{1}:{2}", ts.Hours, ts.Minutes, ts.Seconds)
Console.WriteLine("TotalTime " & et)
Console.WriteLine("Thread Execution Completed")
Console.ReadLine()
End Sub
Private Sub PrintInfo()
For i As Integer = 1 To 5
Console.WriteLine("Thread paused for {0} seconds", 4)
' Make Thread Pause for 4 Seconds
Thread.Sleep(4000)
Console.WriteLine("i value: {0}", i)
Next
End Sub
End Module
If you observe the above example, we used different methods (Start, Join, and Sleep) of Thread class to manage the thread and the Stopwatch functionality is used to calculate the thread execution time based on our requirements.
Here, we used Start() method to start the thread execution, Join() method to halt the execution till the thread execution completed and the Sleep() method is used to pause the thread execution for 4 seconds.
When we execute the above visual basic program, we will get the result as shown below.
Thread paused for 4 seconds
i value: 1
Thread paused for 4 seconds
i value: 2
Thread paused for 4 seconds
i value: 3
Thread paused for 4 seconds
i value: 4
Thread paused for 4 seconds
i value: 5
TotalTime 0:0:20
Thread Execution Completed
This is we can manage the thread execution by using Thread class methods based on our requirements.
In visual basic, by using Abort() method of Thread class we can end or abort the thread execution process. While terminating the thread process, the Abort() method will raise a ThreadAbortException in the thread on which it is invoked.
Following is the example of terminating the thread execution process in visual basic.
Dim t1 As Thread = New Thread(New ThreadStart(PrintInfo))
t1.Start()
t1.Join()
t1.Abort()
In visual basic, we have two types of threads are available, those are
As we discussed, our program code execution will be taken care by the Main thread. If we create any new threads to execute some of the methods those will become a child threads for the Main thread and our application will become a multithreaded application.
Foreground threads are the threads that will run until it finishes its work even if, the Main thread completes its process. So, the lifespan of foreground threads will not depend on the Main thread.
Following is the example of foreground threads in visual basic.
Imports System.Threading
Module Module1
Sub Main(ByVal args As String())
Dim t1 As Thread = New Thread(New ThreadStart(AddressOf PrintInfo))
t1.Start()
Console.WriteLine("Main Thread Execution Completed")
End Sub
Private Sub PrintInfo()
For i As Integer = 1 To 3
Thread.Sleep(2000)
Console.WriteLine("i value: {0}", i)
Next
Console.WriteLine("Child Thread Execution Completed")
End Sub
End Module
If you observe the above example, we created a new child thread (t1) and executing the PrintInfo method. In PrintInfo method every time we are pausing the thread execution for 2 seconds using Sleep method.
When we execute the above program, we will get the result as shown below.
Main Thread Execution Completed
i value: 1
i value: 2
i value: 3
Child Thread Execution Completed
If you observe the above result, even after completion of Main thread execution, the child thread continued its execution and completed its work.
In visual basic, background threads are just opposite of foreground threads. The background threads will quit its process immediately when Main thread quits. Here, the lifespan of background threads will depend on the Main thread.
To make the thread as a background thread, we need to set IsBackground
property to true
for that thread. Background threads are useful for any operation that should continue as long as an application is running but these will not prevent the application from terminating.
Following is the example of creating a background thread by setting IsBackground
property to true
in visual basic.
Imports System.Threading
Module Module1
Sub Main(ByVal args As String())
Dim t1 As Thread = New Thread(New ThreadStart(AddressOf PrintInfo))
t1.Start()
t1.IsBackground = True
Console.WriteLine("Main Thread Execution Completed")
End Sub
Private Sub PrintInfo()
For i As Integer = 1 To 3
Console.WriteLine("i value: {0}", i)
Thread.Sleep(2000)
Next
Console.WriteLine("Child Thread Execution Completed")
End Sub
End Module
If you observe the above example, we created a new child thread (t1) and set IsBackground property to true to make the child thread (t1) as background thread.
When we execute the above program, we will get the result as shown below.
i value: 1
Main Thread Execution Completed
If you observe the above result, the child thread process quits immediately after completion of Main thread execution.
The following are the important points which we need to remember about threads in visual basic.
In the next chapters, we will learn more about using multiple child threads with examples.