Imports System Imports System.Threading
Public Class MainClass
Shared Sub Main() ' create shared object Dim sharedLocation As New CHoldIntegerSynchronized()
sharedLocation.CreateStateOutput()
' Random object used by each thread Dim randomObject As New Random()
' create CProducer and CConsumer objects Dim producer As New CProducer(sharedLocation, randomObject)
Dim consumer As New CConsumer(sharedLocation, randomObject)
' create threads Dim producerThread As New Thread(AddressOf producer.Produce)
Dim consumerThread As New Thread(AddressOf consumer.Consume)
' name threads producerThread.Name = "Producer" consumerThread.Name = "Consumer"
' start threads producerThread.Start() consumerThread.Start()
End Sub ' Main
End Class
Public Class CConsumer Private sharedLocation As CHoldIntegerSynchronized Private randomSleepTime As Random
' constructor Public Sub New(ByVal sharedObject As CHoldIntegerSynchronized, _ ByVal randomObject As Random)
sharedLocation = sharedObject randomSleepTime = randomObject End Sub
Public Sub Consume() Dim count, sum As Integer
For count = 1 To 10 Thread.Sleep(randomSleepTime.Next(1, 3000)) sum += sharedLocation.Buffer Next
Console.WriteLine( "Total " & _ Thread.CurrentThread.Name & " consumed: " & sum & vbCrLf & _ Thread.CurrentThread.Name & " terminated." )
End Sub
End Class
Public Class CHoldIntegerSynchronized
Private mBuffer As Integer() = {-1, -1, -1}
Private occupiedBufferCount As Integer
Private readlocation, writeLocation As Integer
Public Sub New() End Sub ' New
Property Buffer() As Integer Get SyncLock (Me) If occupiedBufferCount = 0 Then Console.WriteLine( "All buffers empty. " & _ Thread.CurrentThread.Name & " waits." )
Monitor.Wait(Me) End If
Dim readValue As Integer = mBuffer(readlocation)
Console.WriteLine( Thread.CurrentThread.Name & " reads " & _ mBuffer(readlocation) )
occupiedBufferCount -= 1
readlocation = (readlocation + 1) Mod mBuffer.Length
CreateStateOutput()
Monitor.Pulse(Me)
Return readValue End SyncLock
End Get
Set(ByVal Value As Integer) SyncLock (Me) If occupiedBufferCount = mBuffer.Length Then Console.WriteLine( "All buffers full. " & _ Thread.CurrentThread.Name & " waits." )
Monitor.Wait(Me) End If
mBuffer(writeLocation) = Value
Console.WriteLine( Thread.CurrentThread.Name & " writes " & _ mBuffer(writeLocation) )
occupiedBufferCount += 1
writeLocation = (writeLocation + 1) Mod _ mBuffer.Length
CreateStateOutput() Monitor.Pulse(Me) End SyncLock
End Set
End Property ' Buffer
Public Sub CreateStateOutput()
Dim i As Integer Console.WriteLine( "(buffers occupied: " & _ occupiedBufferCount & ")" & vbCrLf & "buffers: " )
For i = 0 To mBuffer.GetUpperBound(0) Console.Write( " " & mBuffer(i) & " " ) Next
For i = 0 To mBuffer.GetUpperBound(0) Console.Write( "---- " ) Next
For i = 0 To mBuffer.GetUpperBound(0)
If (i = writeLocation AndAlso _ writeLocation = readlocation) Then
Console.Write( " WR " ) ElseIf i = writeLocation Then Console.Write( " W " ) ElseIf i = readlocation Then Console.Write( " R " ) Else Console.Write( " " ) End If
Next End Sub
End Class
Public Class CProducer Private sharedLocation As CHoldIntegerSynchronized Private randomSleepTime As Random
Public Sub New(ByVal sharedObject As CHoldIntegerSynchronized, _ ByVal randomObject As Random)
sharedLocation = sharedObject randomSleepTime = randomObject End Sub ' New
Public Sub Produce() Dim count As Integer
For count = 11 To 20 Thread.Sleep(randomSleepTime.Next(1, 3000)) sharedLocation.Buffer = count Next
Console.WriteLine( Thread.CurrentThread.Name & _ " done producing. " & vbCrLf & _ Thread.CurrentThread.Name & " terminated." ) End Sub
End Class
|