lo
there being first。 The serial behavior is easy to understand for humans。 Things bee pli
cated when you need to think of multiple tasks at the same time。 While the puter has no
problem with threads; a human who is thinking in a serial manner codes the logic; and thus the
logic could be wrong。
Writing a good threading application should remind you of herding cats or dogs。 If you are
not careful with your threads and synchronization; then it is like herding ten cats into a single
corner—a nearly impossible task; since cats do not respond well to mands。 But if you are
careful and conscientious; then it is like herding ten dogs into a corner—fairly easy if the dogs
are trained。
Waiting for the Thread to End
Calling Start() will start a thread; causing a task to be executed。 The caller of the thread does
not wait for the created thread to end; because the created thread is independent of the caller。
So if you were running a batch process; you would need to wait until all threads have pleted。
The caller logic only needs to start the threads; and thus its work requires a fraction of the time
that the threads require。
There is a way for the caller thread to know when a created thread has exited。 This technique
involves using the Join() method; like this:
Sub ThreadWaitingTask()
Console。WriteLine(〃hello there〃)
Thread。Sleep(2000)
End Sub
…………………………………………………………Page 369……………………………………………………………
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 347
Private Sub ThreadWaiting()
Dim thread As New Thread(AddressOf ThreadWaitingTask)
thread。Start()
thread。Join()
End Sub
The line at the end of the code calls the Join() method; which means that the thread calling
Join() is blocked until the thread referenced by the instance ends。 A Thread。Sleep() call is
used to put the other thread to sleep for the time specified by the parameter—2000 milliseconds; or
2 seconds; in this example。
This code solves the problem of the premature exit of the calling thread; but if the calling
thread is going to wait until the created thread exits; what’s the benefit? In this simple example;
using Join() adds no benefit。 However; when the caller thread executes many threads; the
caller wants to continue only when all threads have finished executing。 So in a multithreading
situation; you would want to call Join() on each and every thread。
Another variation of Join() is where a parameter specifies a timeout。 Imagine starting a
thread; and in the worst…case scenario; you predict a processing time of 5 minutes。 If the processing
time is exceeded; the logic is to forcibly exit the thread。 Here’s the code to implement that logic:
If Not thread。Join(300000) Then
thread。Abort()
End If
In the example; calling Join() will cause the executing thread to wait 300;000 milliseconds
(5 minutes) before continuing。 If the timeout occurred; the Join() method would return False;
and the code would forcibly exit the thread using the Abort() method。
■Note It is wise to avoid using Abort() except in the most dire of situations; because data will be corrupted。
Creating a Thread with State
In the threading example; the threads did not manage any state。 In most cases; your threads
will reference some state。
Implementing a ThreadStart Delegate
One way to run a thread with state is to define a type that implements a delegate of the type
ThreadStart。 The following example defines a class with a method that will be called by a thread。
The technique used is where a delegate from another class instance is passed to the Thread type。
Class ThreadedTask
Private whatToSay As String
Public Sub New(ByVal whattosay As String)
_whatToSay = whattosay
End Sub
…………………………………………………………Page 370……………………………………………………………
348 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
Public Sub MethodToRun()
Console。WriteLine(〃I am babbling (〃 & _whatToSay & 〃)〃)
End Sub
End Class
To use the method; the threading code is changed as follows:
Dim task As ThreadedTask = New ThreadedTask(〃hello〃)
Dim thread As Thread = _
New Thread(AddressOf task。MethodToRun)
thread。Start()
In the example; the ThreadedTask type is instantiated with a state; and then Thread is
instantiated with the stateful task。MethodToRun() method。 When the thread starts; the data
member _whatToSay will have some associated state。 The code is logical and has no surprises。
But what if you were to use the stateful method twice; like this:
Dim task As ThreadedTask = New ThreadedTask(〃hello〃)
Dim thread1 As Thread = New Thread(AddressOf task。MethodToRun)
Dim thread2 As Thread = New Thread(AddressOf task。MethodToRun)
thread1。Start()
thread2。Start()
Here; there are two Thread instances; but a single task instance。 There will be two threads
doing the same thing; and even worse; two threads sharing the same state。 It is not wrong to
share state; but sharing state requires special treatment to ensure that state remains consistent。
You need to instantiate a single ThreadedTask and associate it with a single Thread instance;
like this:
Dim task1 As Thread
小说推荐
- 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章