VB.Net/Thread/Thread Synchronize

Материал из VB Эксперт
Перейти к: навигация, поиск

Synchronize Thread Demo

<source lang="vbnet"> Imports System Imports System.Threading Imports System.Text Imports System.Windows.Forms Public Class MainClass

 Public Shared Sub Main()
   Dim myHouse As New House()
 End Sub
 

End Class

Public Class House

 Dim house As String = New String("Lock")
 Public Sub New()
   Dim aThreadStart As Threading.ThreadStart
   Dim aThread As Thread
   Dim i As Integer
   For i = 0 To 10
     aThreadStart = New ThreadStart(AddressOf ChangeTemperature)
     aThread = New Thread(aThreadStart)
     aThread.Name = CStr(i) & ""th room"
     aThread.Start()
   Next
 End Sub
 Private Sub ChangeTemperature()
   SyncLock (house)
      Console.WriteLine("Checking 1")
      Console.WriteLine("Checking 2")
      Console.WriteLine("Checking 3")
      Try
         Thread.Sleep(1000)
      Catch E As ThreadInterruptedException
         "thread ended 
      End Try
      
      Console.WriteLine("Checking 4")
      Console.WriteLine("Checking 5")
      Console.WriteLine("Checking 6")
      Console.WriteLine("Checking 7")
      Console.WriteLine("Checking 8")
      Console.WriteLine("Checking 9")
      Console.WriteLine("Checking 10")
   End SyncLock
 End Sub

End Class


      </source>


Thread without Synchronizing

<source lang="vbnet"> Imports System Imports System.Threading Imports System.Text Imports System.Windows.Forms Public Class MainClass

 Public Shared Sub Main()
   Dim myHouse As New House()
 End Sub
 

End Class

Public Class House

 Dim house As String = New String("Lock")
 Public Sub New()
   Dim aThreadStart As Threading.ThreadStart
   Dim aThread As Thread
   Dim i As Integer
   For i = 0 To 10
     aThreadStart = New ThreadStart(AddressOf ChangeTemperature)
     aThread = New Thread(aThreadStart)
     aThread.Name = CStr(i) & ""th room"
     aThread.Start()
   Next
 End Sub
 Private Sub ChangeTemperature()
"   SyncLock (house)
      Console.WriteLine("Checking 1")
      Console.WriteLine("Checking 2")
      Console.WriteLine("Checking 3")
      Try
         Thread.Sleep(1000)
      Catch E As ThreadInterruptedException
         "thread ended 
      End Try
      
      Console.WriteLine("Checking 4")
      Console.WriteLine("Checking 5")
      Console.WriteLine("Checking 6")
      Console.WriteLine("Checking 7")
      Console.WriteLine("Checking 8")
      Console.WriteLine("Checking 9")
      Console.WriteLine("Checking 10")

" End SyncLock

 End Sub

End Class


      </source>


Two threads without SyncLock

<source lang="vbnet"> Imports System Imports System.Drawing Imports System.Threading Imports System.Windows.Forms Imports System.IO

public class MainClass

  Shared counter As Integer
  Shared locker As Object = New Object()
  Shared Sub Main()
       Dim aThread As Thread = New Thread(AddressOf Calculate)
       Dim bThread As Thread = New Thread(AddressOf Calculate)
       aThread.Start()
       bThread.Start()
  End Sub
  Shared Sub Calculate()
       Console.WriteLine("Thread " & Thread.CurrentThread.GetHashCode & " woke up. Counter=" & counter)

" SyncLock locker

          Console.WriteLine("In Locker")
          Console.WriteLine("1")
          Console.WriteLine("2")
          
          Dim i As Integer = 0
          Dim j As Integer = 0
          
          For i = 0 To 10000
              For j = 0  To 10000
                  
              Next j
          Next i
          Console.WriteLine("3")
          Console.WriteLine("4")
          Console.WriteLine("5")
"       End SyncLock
       Console.WriteLine("Out Locker")
       Console.WriteLine("Thread " & Thread.CurrentThread.GetHashCode & " woke up. Counter=" & counter)
   End Sub

End Class


      </source>


Two threads with SyncLock

<source lang="vbnet"> Imports System Imports System.Drawing Imports System.Threading Imports System.Windows.Forms Imports System.IO

public class MainClass

  Shared counter As Integer
  Shared locker As Object = New Object()
  Shared Sub Main()
       Dim aThread As Thread = New Thread(AddressOf Calculate)
       Dim bThread As Thread = New Thread(AddressOf Calculate)
       aThread.Start()
       bThread.Start()
  End Sub
  Shared Sub Calculate()
       Console.WriteLine("Thread " & Thread.CurrentThread.GetHashCode & " woke up. Counter=" & counter)
       SyncLock locker
          Console.WriteLine("In Locker")
          Console.WriteLine("1")
          Console.WriteLine("2")
          
          Dim i As Integer = 0
          Dim j As Integer = 0
          
          For i = 0 To 10000
              For j = 0  To 10000
                  
              Next j
          Next i
          Console.WriteLine("3")
          Console.WriteLine("4")
          Console.WriteLine("5")
       End SyncLock
       Console.WriteLine("Out Locker")
       Console.WriteLine("Thread " & Thread.CurrentThread.GetHashCode & " woke up. Counter=" & counter)
   End Sub

End Class


      </source>