Imports System
Imports System.Threading
Public Module ThreadSample
Public Balance As Integer = 1000
Sub Main()
Dim account As Account = New Account()
Dim depositeBalance1 As DepositeBalance = New _
DepositeBalance(account, 1000, "Customer 1")
Dim depositeBalance2 As DepositeBalance = New _
DepositeBalance(account, 1000, "Customer 2")
Dim t1 As Thread = New _
Thread(AddressOf depositeBalance1.DepositeAmount)
Dim t2 As Thread = New _
Thread(AddressOf depositeBalance2.DepositeAmount)
t1.Start()
t2.Start()
Try
'阻塞调用线程,直到某个线程终止时为止
t1.Join()
't2.Join()
Catch e As Exception
Console.Write(e.ToString())
Finally
'Do Nothing
End Try
End Sub
Public Class Account
Private balanceAmount As Integer
Public Sub Deposite(ByVal amount As Integer, _
ByVal message As String)
Console.WriteLine(message & _
" Depositing Amount " & amount)
Console.WriteLine(message & " Checking Previous Balance")
'Monitor 类通过向单个线程授予对象锁来控制对对象的访问。对象锁提供限制访问代码块(通常称为临界区)的能力。当一个线程拥有对象的锁时,其他任何线程都不能获取该锁。还可以使用 Monitor 来确保不会允许其他任何线程访问正在由锁的所有者执行的应用程序代码节,除非另一个线程正在使用其他的锁定对象执行该代码。
'临界区的开头,保证只能有一个线程来操作
Monitor.Enter(Me)
balanceAmount = getBalance()
Console.WriteLine(message & _
" Previous Balance in Account " & balanceAmount)
balanceAmount += amount
Console.WriteLine(message & _
" Updating Balance in Account ")
setBalance(balanceAmount)
Monitor.Exit(Me)
'记临界区的结尾
Console.WriteLine(message & " Update Balance " & Balance)
End Sub
Private Function getBalance() As Integer
Try
'将当前线程阻塞指定的毫秒数
Thread.Sleep(1000)
Catch e As Exception
Console.WriteLine(e.ToString())
Finally
'Do Nothing
End Try
Return Balance
End Function
Private Sub setBalance(ByVal amount As Integer)
Try
'将当前线程阻塞指定的毫秒数
Thread.Sleep(1000)
Catch e As Exception
Console.WriteLine(e.ToString())
Finally
'Do Nothing
End Try
Balance = amount
End Sub
End Class
Public Class DepositeBalance
Private account As Account
Private amount As Integer
Private message As String
Public Sub new(ByRef account As Account, _
ByVal amount As Integer, ByVal message As String)
MyBase.New()
Me.account = account
Me.amount = amount
Me.message = message
End Sub
Public Sub DepositeAmount()
Account.Deposite(amount, message)
End Sub
End Class
End Module
Imports System.Threading
Public Module ThreadSample
Public Balance As Integer = 1000
Sub Main()
Dim account As Account = New Account()
Dim depositeBalance1 As DepositeBalance = New _
DepositeBalance(account, 1000, "Customer 1")
Dim depositeBalance2 As DepositeBalance = New _
DepositeBalance(account, 1000, "Customer 2")
Dim t1 As Thread = New _
Thread(AddressOf depositeBalance1.DepositeAmount)
Dim t2 As Thread = New _
Thread(AddressOf depositeBalance2.DepositeAmount)
t1.Start()
t2.Start()
Try
'阻塞调用线程,直到某个线程终止时为止
t1.Join()
't2.Join()
Catch e As Exception
Console.Write(e.ToString())
Finally
'Do Nothing
End Try
End Sub
Public Class Account
Private balanceAmount As Integer
Public Sub Deposite(ByVal amount As Integer, _
ByVal message As String)
Console.WriteLine(message & _
" Depositing Amount " & amount)
Console.WriteLine(message & " Checking Previous Balance")
'Monitor 类通过向单个线程授予对象锁来控制对对象的访问。对象锁提供限制访问代码块(通常称为临界区)的能力。当一个线程拥有对象的锁时,其他任何线程都不能获取该锁。还可以使用 Monitor 来确保不会允许其他任何线程访问正在由锁的所有者执行的应用程序代码节,除非另一个线程正在使用其他的锁定对象执行该代码。
'临界区的开头,保证只能有一个线程来操作
Monitor.Enter(Me)
balanceAmount = getBalance()
Console.WriteLine(message & _
" Previous Balance in Account " & balanceAmount)
balanceAmount += amount
Console.WriteLine(message & _
" Updating Balance in Account ")
setBalance(balanceAmount)
Monitor.Exit(Me)
'记临界区的结尾
Console.WriteLine(message & " Update Balance " & Balance)
End Sub
Private Function getBalance() As Integer
Try
'将当前线程阻塞指定的毫秒数
Thread.Sleep(1000)
Catch e As Exception
Console.WriteLine(e.ToString())
Finally
'Do Nothing
End Try
Return Balance
End Function
Private Sub setBalance(ByVal amount As Integer)
Try
'将当前线程阻塞指定的毫秒数
Thread.Sleep(1000)
Catch e As Exception
Console.WriteLine(e.ToString())
Finally
'Do Nothing
End Try
Balance = amount
End Sub
End Class
Public Class DepositeBalance
Private account As Account
Private amount As Integer
Private message As String
Public Sub new(ByRef account As Account, _
ByVal amount As Integer, ByVal message As String)
MyBase.New()
Me.account = account
Me.amount = amount
Me.message = message
End Sub
Public Sub DepositeAmount()
Account.Deposite(amount, message)
End Sub
End Class
End Module