You need to instantiate a single ThreadedTask and associate it with a single Thread instance;
like this:
Dim task1 As ThreadedTask = New ThreadedTask(〃hello〃)
Dim task2 As ThreadedTask = New ThreadedTask(〃goodbye〃)
Dim thread1 As Thread = New Thread(AddressOf task1。MethodToRun)
Dim thread2 As Thread = New Thread(AddressOf task2。MethodToRun)
thread1。Start()
thread2。Start()
If you are running a stateful method; you need to associate a task instance with a thread
instance。
Using a Thread Parameter
Suppose that you want to create a stateful thread。 You can do this by using a thread parameter。 In
other words; the method that you invoke on another thread takes a parameter。 Here’s an example:
…………………………………………………………Page 371……………………………………………………………
C HA P TE R 1 3 ■ L E AR N IN G AB O U T M U L T IT HR E AD IN G 349
Sub SimpleThreadWithStateTask(ByVal buffer As Object)
Console。WriteLine(〃You said (〃 & buffer。ToString() & 〃)〃)
End Sub
Private Sub SimpleThreadWithState()
Dim thread1 As New Thread(AddressOf SimpleThreadWithStateTask)
thread1。Start(〃my text〃)
End Sub
The major difference with a thread parameter is that you declare the function that is executed
with a parameter; and the Start() method has a parameter。
Two restrictions apply to using a thread parameter: you can send only a single parameter;
and that parameter must be an object。
Synchronizing Between Threads
When you have two threads and both share state (such as a variable); a concurrency situation
may arise。 Sharing state between two independent threads is not a problem if both threads
consider the data as read…only。 What does the reading thread read? Is the state consistent? It is
probably not consistent; and that is why you need to synchronize access to state。
Let’s consider a simple collection class example。 The following source code executes
in the calling thread; instantiates a list collection; and then adds two numbers to the collection。
Dim elements As List(Of Integer)= New List(Of Integer)()
elements。Add(10)
elements。Add(20)
In the next step; we define a method that iterates the elements collection (which is declared at
a higher scope)。
Sub Task1()
Thread。Sleep(1000)
Dim item As Integer
For Each item In elements
Console。WriteLine(〃Item (〃 & item & 〃)〃)
Thread。Sleep(1000)
Next
End Sub
This thread iterates the data; and the two Thread。Sleep() calls put the threads to sleep for
1000 milliseconds; or 1 second。 By putting the thread to sleep; we can artificially construct a
situation where another thread adds to the collection while the collection is being iterated。
The method that adds an element to the collection is defined as follows:
Sub Task2()
Thread。Sleep(1500)
elements。Add(30)
End Sub
…………………………………………………………Page 372……………………………………………………………
350 CH AP T E R 1 3 ■ L E A R N I N G A B OU T M U L T I TH R E A DI N G
The Task1() and Task2() methods are started in separate threads as follows::
elements。Add(10)
elements。Add(20)
Dim thread1 As New Thread(AddressOf Task1)
Dim thread2 As New Thread(AddressOf Task2)
thread1。Start()
thread2。Start()
Running the threaded code will generate an exception; but not immediately。 First; the caller
thread creates and starts thread1 and thread2。 thread1 goes to sleep for 1 second; and thread2
goes to sleep for 1。5 seconds。 After thread1 awakens; one item in the collection is iterated; and
thread1 goes to sleep for another second。 But before thread1 reawakens; thread2 awakens and
adds an element to the collection。 When thread1 reawakens and attempts to iterate another
element in the collection; an exception is generated; as shown in Figure 13…4。
Figure 13…4。 Exception thrown after adding element to the collection; as shown in the Visual Basic IDE
The InvalidOperationException is thrown to indicate that you can’t add elements to a
collection while iterating a collection。 The collection classes think it is a bad idea to modify and
iterate a collection at the same time。 I agree with the collection classes; because doing so could
give unpredictable results。
The problem in the source code is how to use the collection classes in a multithreaded
context。 In the example; items are added to the collection while the collection is being iterated。
A monly suggested approach is to use the type System。Collections。ObjectModel。
ReadOnlyCollection; as in the following example。
Imports System。Collections。ObjectModel
Imports System。Threading
…………………………………………………………Page 373……………………………………………………………
C HA P TE R 1 3 ■ L E AR N IN G AB O U T M U L T IT HR E AD IN G 351
Module ThreadProblem
Dim elements As List(Of Integer) = New List(Of Integer)()
Sub Task1()
Thread。Sleep(1000)
Dim item As Integer
Dim listElements As New ReadOnlyCollection(Of Integer)(elements)
For Each item In listElements
Console。WriteLine(〃Item (〃 & item & 〃)〃)
Thread。Sleep(1000)
Next
End Sub
Sub Task2()
Thread。Sleep(1500)
elements。Add(30)
End Sub
Sub Main()
elements。Add(10)
小说推荐
- oracle从入门到精通(PDF格式)
- -Page 1-Oracle 从入门到精通-Page 2-资源来自网络,仅供学习 Oracle 从入门到精通一、SQL 8
- 最新章:第37章
- C语言游戏编程从入门到精通(PDF格式)
- -Page 1-Page 2-Page 3-Page 4-Page 5-Page 6-Page 7-Page 8-Page 9-Page 10-Page 11-Page 12-Page 13-Page 14
- 最新章:第4章
- Java编程思想第4版[中文版](PDF格式)
- -Page 1-Page 2《Thinking In Java》中文版作者:Bruce Eckel主页:http/BruceEckel.编译:Trans Bot主页:http/memberease~transbot致谢-献给那些直到现在仍在孜孜不倦创造下一代计算机语言的人们!指导您利用万维网的语言进
- 最新章:第295章
- 深入浅出MFC第2版(PDF格式)
- -Page 1-Page 2-山高月小山高月小 水落石出水落石出山高月小山高月小 水落石出水落石出-Page 3-深入淺出MFC(第版 使用Visual C 5.0 MFC 4.2)Dissecting MFC(Second Edition Using Visual C 5.0 MFC 4.2)侯俊
- 最新章:第309章
- VC语言6.0程序设计从入门到精通
- -Page 1-Visual C 6.0 程序设计从入门到精通求是科技 王正军 编著
- 最新章:第136章
- SQL 21日自学通(V3.0)(PDF格式)
- -Page 1-SQL 21 日自学通(V1.0 翻译人 笨猪目录目录 1译者的话 14第一周概貌 16从这里开始 16
- 最新章:第170章
- 2008年青年文摘精编版
- 作者:中国青年出版社“初恋”的惩罚.作者:凡 凡 文章来源《真情》2005年第4期 点击数:6608 更新时间:2005-6-5过了年,我就十八岁了。离高考只剩下四个多月了。这一段,班里的男女生相互间递纸条、写情书、约会等地下活动慢慢的多了起来。我这个“尖子生”也突然感到了不安、慌乱,并且自责。不知
- 最新章:第230章
- JMS简明教程(PDF格式)
- -Page 1-JMS1.1规范中文版卫建军2007‐11‐22-Page 2
- 最新章:第28章
- SQL语言艺术(PDF格式)
- -Page 1-SQLSSQQLL语言艺术内容介绍本书分为12章,每一章包含许多原则或准则,并通过举例的方式对原则进行解释说明。这些例子大多来自于实际案例,对九种SQL经典查询场景以及其性能影响讨论,非常便于实践,为你数据库应用维护人员阅读。资深 SQL 专家 Stéphane Faroult倾力打
- 最新章:第27章