-
vb.net 教程 6-16 使用SyncLock语句实现线程的同步
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
先看以下代码:
Sub sample12()
For i As Integer = 0 To 5
Dim sample12_Thread As New Thread(AddressOf sample12_doALoop1)
sample12_Thread.Start(i)
Next
Thread.Sleep(1000)
Console.ReadKey()
End Sub
Sub sample12_doALoop1(ByVal number As Integer)
Dim counter As Integer = CType(number, Integer)
For i As Integer = 1 To 100
Console.Write(" " & counter)
Next
End Sub
得到的结果可能如下,关键的地方我用红框标记出来了:
可以看到上面的输出比较混乱,这是由于线程是由系统控制,我们也不知道在哪个位置,系统就将线程1停了启动了线程2,接着又将线程2停了,切换运行线程4……。本来想完整地输出100个0、100个1……(什么?你还想按照0至5的顺序输出?我这里只谈如何完整地输出100个0、100个1……不谈顺序),这段代码实现不了的,也许偶尔会正确。
解决上面的问题,就需要使用 SyncLock 语句。
MSDN:SyncLock 语句可确保多个线程不在同一时间执行语句块。 SyncLock 防止各个线程进入该语句块,直到没有其他线程执行它为止。SyncLock 的最常见作用是保护数据不被多个线程同时更新。 如果操作数据的语句必须在没有中断的情况下完成,请将它们放入 SyncLock 块。使用方法如下:
SyncLock lockobject
[ block ] ‘独占锁时要执行的语句块
End SyncLock
需要注意的是,lockobject应该满足以下条件:
1、值不能是Nothing
2、不应使用 Me 关键字为实例数据提供锁定对象
3、应该是引用类型,不要使用Integer这样的值类型
4、必须定义为线程间可以共享的变量,下面的例子将定义为模块级变量
根据以上介绍,修改后的代码如下:
定义一个模块级变量:
Private lockObj As Object
修改后的主程序:
Sub sample12()
lockObj = New Object
For i As Integer = 0 To 5
Dim sample12_Thread As New Thread(AddressOf sample12_doALoop2)
sample12_Thread.Start(i)
Next
Thread.Sleep(1000)
Console.ReadKey()
End Sub
Sub sample12_doALoop2(ByVal number As Integer)
Dim counter As Integer = CType(number, Integer)
SyncLock lockObj
For i As Integer = 1 To 100
Console.Write(" " & counter)
Next
End SyncLock
End Sub
我们将子线程的循环块代码锁定,确保它完成。运行结果如下:
还强调的是,虽然看着是按照0-5的顺序调用线程,但是输出顺序确实不能控制。除非是采用别的代码实现,留给各位朋友自己来写。
由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供参考。
学习更多vb.net知识,请参看 vb.net 教程 目录
————————————————
版权声明:本文为CSDN博主「VB.Net」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/UruseiBest/article/details/87898010
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数