C#多线程学习之:Monitor类

 

关于对C#多线程类Monitor的理解

  

1、对线程的理解

围绕着锁周围的线程可以分为以下三类:

l  拥有锁的线程:只有一个

l  就绪队列:只有就绪队列里的线程才有机会在锁被释放时去获取锁。

l  等待队列:没有资格去获取锁。

 

2、Monitor.Wait(obj)方法

当线程调用 Wait 时,它释放对象的锁并进入对象的等待队列,对象的就绪队列中的下一个线程(如果有)获取锁并拥有对对象的独占使用。

Wait(obj)就是交出锁的使用权,把自己移到等待队列里,处于阻塞状态,当再次获得锁时(得先收到脉冲信号移动到就绪队列然后其他线程释放锁)返回true并且线程继续执行,否则不返回一直阻塞。

 

3、Monitor.Pulse方法

通知(也就是发出脉冲信号)等待队列中的线程锁定对象的状态即将发生更改。接收到脉冲后,等待线程就被移动到就绪队列中。在锁定对象被解锁后,就绪队列中的下一个线程(不一定是接收到脉冲的线程)将获得该锁。pulse()并不会使当前线程释放锁。

 

4、获取锁的过程

当一个线程尝试着lock一个同步对象的时候,该线程就在就绪队列中排队。一旦没人拥有该同步对象,就绪队列中的线程就可以占有该同步对象。这也是我们平时最经常用的lock方法。

为了其他的同步目的,占有同步对象的线程也可以暂时放弃同步对象,并把自己流放到等待队列中去。这就是Monitor.Wait。由于该线程放弃了同步对象,其他在就绪队列的排队者就可以进而拥有同步对象。

比起就绪队列来说,在等待队列中排队的线程更像是二等公民:他们不能自动得到同步对象,甚至不能自动移动到就绪队列。而Monitor.Pulse的作用就是开一次门,使得一个正在等待队列中的线程移动到就绪队列;相应的Monitor.PulseAll则打开门放所有等待队列中的线程到就绪队列。

 

5、Monitor.Wait(obj,timeOut)

阻塞自己后把自己调到等待线程,直到再次获得锁才返回继续执行。

关于该方法的一些理解分析:

l  第二个参数 tiemout表示线程释放锁进入等待队列后到进入就绪队列之前等待的一个限定时间(单位是毫秒)。

l  如果在限定时间内再次获得锁(包括收到脉冲信号然后移到就绪队列并且其他线程释放锁)就返回true然后继续运行;

l  如果在限定时间内没有收到脉冲信号,超时后,就被移到就绪队列,直到获得锁才返回,返回false;

l  如果在限定时间内收到脉冲信号,移动到就绪队列,直到获得锁才返回,返回true;

l  该方法只会在再次获得锁时才会返回,否则一直阻塞(一开始是在等待队列,最终会被移动到就绪队列);

l  建议:pulse后直接wait,中间别放其他代码。因为Monitor.Wait(obj,timeOut) 方法返回false还是true取决于在限定时间内是否收到脉冲信号从而移到就绪队列;

 

关于lock、线程池和定时器的简单介绍

l  Lock是一个语法糖,效果相当于Monitor的TryEnter和Exit方法

l  Lock锁定的对象建议是类的一个static对象,详情见 http://www.cnblogs.com/xd125/archive/2007/12/12/992406.html

l  线程池 http://www.cnblogs.com/huangxincheng/archive/2012/03/18/2405039.html

 

DispatcherTimer类的使用

DispatcherTimer类位于System.Windows.Threading命名空间下,类似于winform的Timer类。
{ DispatcherTimer timer = new DispatcherTimer(); timer.Interval = TimeSpan.FromSeconds(1); timer.Tick += new EventHandler(timer_Tick); } void timer_Tick(object sender, EventArgs e) { tb.Text = DateTime.Now.ToLongTimeString(); } 上面的代码演示了一个简单的时钟程序,每隔一秒中更新一次时间

l  

 

             

转载于:https://www.cnblogs.com/zouzf/p/3305643.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

形参的一种特殊写法

形参的一种特殊写法 import java.lang.*; import javax.swing.*; import javax.swing.text.IconView;public class Xample_3 {public void Str (String...strings){for(int i0; i<strings.length;i){System.out.println(strings[i]);}}public void Int(int...is){int isall …

【0.96寸 OLED屏实现1500Fps的帧率】STM32 软件、硬件SPI、I2C驱动总结

目录SPI版OLED SPI 端口定义七针OLED引脚定义六针OLED引脚定义软件SPI硬件SPI启用DMA帧率测试I2C 版软件I2C硬件I2CDMASTM32F103VET6 STM32 Cube IDE SPI版 OLED SPI 端口定义 本节引自STM32驱动0.96寸OLED液晶屏(12864液晶屏) —— 小牧同学 两种屏幕的引脚数不一样&#x…

Datatables 给行绑定选中事件

//给行绑定选中事件$(#table_id_example tbody).on( click, tr, function () {if ($(this).hasClass(selected)) {$(this).removeClass(selected);}else {table.$(tr.selected).removeClass(selected);$(this).addClass(selected);}} );

网络工程师第五站-有线、无线同网段混合组网(多FAT案例)

本案例中用到的设备&#xff1a;路由器&#xff1a;cisco 2851交换机&#xff1a;cisco WS-C3750G-12S &#xff08;HX&#xff09;&#xff0c;接入&#xff1a;WS-C2960-48TC-LAP &#xff1a; 华为AP3010dn-AGN3750G 作为该网络核心交换机HX&#xff0c;前面的接口&#xff…

Jstat使用样例

jstat -gc pid //以字节形式展现 jstat -gcutil pid //以百分比形式展现 jstat -class pid //类加载和卸载状况 jstat -compilier pid //查看Jit编译的方法数及失败情况 jstat -printcompilation 4672 //打印最近编译的一个方法 转载于:https://www.cnblogs.com/ironroot/p…

JAVA静态和非静态内部类

JAVA静态和非静态内部类 一直对java的静态和非静态内部类的东东理解不清楚&#xff0c;今天测试了一下&#xff0c;下面把测试结果记录一下&#xff0c;加深印象。用于以后查找。 直接上代码。 Java代码 package com.test.xml; /** * author <a href"mailto:dq201…

便宜的手机图传遥控模块

目录测试程序FHDFPV.cFHDFPV.h应用效果STM32F103RC STM32 Cube IDE 大一时买的&#xff0c;当时是50元左右&#xff0c;很便宜&#xff0c;安卓上位机为FHDFPV 我买的型号波特率约为18464&#xff0c; 实测帧头为102&#xff0c;帧尾为153&#xff0c;前四个数为左右遥感对应…

使用pycharm配置flask项目,并使用git进行版本控制

https://blog.csdn.net/s1025491598/article/details/86609255 遇到的坑 (Mac pycharm 2018) 1. 在pycharm Terminal 命令窗口下&#xff0c;运行 git init mac下查看git安装目录&#xff0c;后解决

「Jenkins+Git+Maven+Shell+Tomcat持续集成」经典教程

Jenkins 是一个开源软件项目&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件的持续集成变得可能。现在软件开发追求的是效率以及质量&#xff0c;Jenkins使得自动化成为可能&#xff01; 亮点 采用shell自定义脚本,控制集成部署环境更加方便灵活精简war包中的li…

使用Altium Designer进行DDR2的PCB设计(转比较不错)

转载于&#xff1a;http://blog.csdn.net/snaking616/article/details/53981973 本文首先列出了DDR2布线中面临的困难&#xff0c;接着系统的讲述了DDR2电路板设计的具体方法&#xff0c;最后给出个人对本次电路设计的一些思考。本次设计中CPU的封装为BGA844-SOC-Y&#xff0c;…

【机器视觉学习笔记】OpenCV C++ 与 HSV颜色模型

目录HSV颜色模型Opencv中的HSV获取颜色值的小工具平台&#xff1a;Windows 10 20H2 Visual Studio 2015 opencv_contrib-3.4.12 HSV颜色模型 本节内容摘自HSV模型及opencv应用 —— ponponon 这个模型中颜色的参数分别是&#xff1a;色调&#xff08;H&#xff09;&#xff…

win10 解决升级 WordPress 时提示”另一更新正在进行”

1. 确定 wordpress 目录的 users 权限为 完全控制。 2. https://www.wpdaxue.com/wordpress-update-problem.html 本文目录 [隐藏] 1情景再现2解决办法 WordPress 4.5 下载安装量已经超过 600 万&#xff0c;而第一个维护版本 WordPress 4.5.1 已发布&#xff0c;修复了 Wo…

清除Linux终端命令的历史记录

在Linux终端下1、运行history&#xff0c;可以得到一个整洁的Linux终端命令历史记录的列表2、运行history -c&#xff0c;可以清除杂乱的历史记录&#xff08;需要重启&#xff09;3、运行history -r /home/yajiu/history.txt&#xff0c;可以将history.txt文件存储的常用命令读…

暑假集训D19总结

考试 日常爆炸 T1 辣么简单&#xff0c;淼到极致的DP&#xff0c;我竟然打挂了 &#xff0c;打挂了 &#xff0c;只拿了75分啊&#xff0c;不能接受啊 T2 随便找找规律&#xff0c;瞎XX模拟一下就能A的鬼东西&#xff0c;我竟然打了个暴力Floyed判环&#xff08;是叫这个鬼…

【STC15库函数上手笔记】7、PCA与PWM

目录硬知识硬件知识CCP/PWM/PCA模块的结构软件知识PCA初始化函数PWM更新占空比函数测试程序PWM模式产生PWM信号main.c实验现象16位软件定时器模式模式产生PWM信号main.c实验现象捕获模式测量周期长度main.c实验现象STC实验箱4 IAP15W4K58S4 Keil uVision V5.29.0.0 PK51 Prof…

单元测试概述

盖种测试 1.语句覆盖&#xff1a;语句覆盖是几个测试用例的设计&#xff0c;通过测试程序运行。使每一个可以运行的语句至少运行一次。 2.判定覆盖&#xff08;也叫分支覆盖&#xff09;&#xff1a;设计若干个測试用例。运行所測程序&#xff0c;使程序中每一个…

JQuery官方学习资料(译):遍历JQuery对象和非JQuery对象

JQuery提供了一个对象遍历的Utility方法$.each()和一个JQuery集合遍历方法.each()。$.each()$.each()是一个通用的方法用来遍历对象和数组&#xff0c;Plain对象是通过其命名属性进行遍历的。$.each()可以用来替换传统的for和for-in循环。var sum 0;var arr [ 1, 2, 3, 4, 5 …

【STC15库函数上手笔记】8、比较器

目录库函数compare.ccompare.hSTC15Fxxxx.H测试程序main.cSTC实验箱4 IAP15W4K58S4 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 库函数 比较器的库函数仅在官方例程中发现&#xff0c;未与其他库函数放在一起&#xff0c;笔者也未对其进行测试&…

WIN10 下 PHP7 中文乱码的解决办法

在数据提交前&#xff0c;插入语句 mysqli_set_charset($conn,utf8);

不会几个框架,都不好意思说搞过前端: Vue.js - 60分钟快速入门

Vue.js——60分钟快速入门 Vue.js是当下很火的一个JavaScript MVVM库&#xff0c;它是以数据驱动和组件化的思想构建的。相比于Angular.js&#xff0c;Vue.js提供了更加简洁、更易于理解的API&#xff0c;使得我们能够快速地上手并使用Vue.js。 本文摘自&#xff1a;http://www…