C#中添加三个线程同时启动执行某一方法,并依次调用某方法中的循环打印输。
添加三个线程同时启动执行某一方法,并依次调用某方法中的打印输:ABC ABC ABC ABC

实现代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace SuperMarket.Test
{
class Program
{
static void Main(string[] args)
{
myTests mt = new myTests();
mt.RunTest(); } }
class myTests
{
char last = 'c';
object obj = new object();
public void RunTest()
{
Thread th1 = new Thread(ShowNum);
Thread th2 = new Thread(ShowNum);
Thread th3 = new Thread(ShowNum); th1.Start('a');
th2.Start('b');
th3.Start('c'); } private void ShowNum(object name)
{
for (int i = ; i < ; i++)
{
lock (obj)
{
if ((Char)name == last + || (Char)name == last - )//如果是连续的下一个字
{
Console.WriteLine(name);
last = (Char)name;
Monitor.PulseAll(obj);
}
else
{
i--;
Monitor.Wait(obj);
}
}
} }
} }
这里介绍下上面的几处用法:

1、三个线程同时调用ShowNum方法,这时候,由于进入ShowNum方法的先后不同。所以,在执行300次循环时,调用的内容先后是不同的。因此,我们要定义一个Object对像,然后使用lock(obj)将进入循环体的线程锁定。
2、使用last变量来存放本次打印在屏幕上的字母。下一次进入判断体时,就知道下一个要打印的是什么了。默认值为c,就意味着第一个要打印的是c-2=a,所以是a字母。
3、对于本轮不应该打印的线程,就让他到lock外面等候通知。所以调用了Moitor.Wait(obj)方法。因为本次他也执行了判断,所以循环就少了一次,为了给被回循环,就让循环变量i的值-1,这就是i--的原因。
4、当打印完后,记录好本次打印了的字母后,要调用 Monitor.PulseAll方法通知那个正在等候的线程,进入Lock体做判断。
5、 Monitor.Wait(obj);和 Monitor.PulseAll(obj);可以不加,不过为了提高性能,就最好加上。加与不加的性能相差巨大的。请最好加上。
C#中添加三个线程同时启动执行某一方法,并依次调用某方法中的循环打印输。的更多相关文章
- hibernate中保存一个对象后再设置此对象的属性为什么不需要调用update方法了
		
hibernate中保存一个对象后再设置此对象的属性为什么不需要调用update方法了 例如session.save(user);user.setAge(20); 原因: hibernate对象的三种 ...
 - 在IE中,JS方法名和input的name重名时,调用该方法无效
		
在IE中,JS方法名和input的name重名时,调用该方法无效.提示:网页错误详细信息 用户代理: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1 ...
 - Replication基础(六) 复制中的三个线程(IO/SQL/Dump)
		
Reference: https://blog.csdn.net/sun_ashe/article/details/82181811?utm_source=blogxgwz1 简介在MySQL复制技 ...
 - 三个线程abc顺序执行
		
1.使用synchronized悲观锁(秋招阿里的一个笔试题,应该写的比较复杂,然后就没有然后了o(╥﹏╥)o) public class ThreadThreadp { private int fl ...
 - Mybaits 源码解析 (七)----- Select 语句的执行过程分析(下篇)(Mapper方法是如何调用到XML中的SQL的?)全网最详细,没有之一
		
我们上篇文章讲到了查询方法里面的doQuery方法,这里面就是调用JDBC的API了,其中的逻辑比较复杂,我们这边文章来讲,先看看我们上篇文章分析的地方 SimpleExecutor public & ...
 - Mybaits 源码解析 (六)----- 全网最详细:Select 语句的执行过程分析(上篇)(Mapper方法是如何调用到XML中的SQL的?)
		
上一篇我们分析了Mapper接口代理类的生成,本篇接着分析是如何调用到XML中的SQL 我们回顾一下MapperMethod 的execute方法 public Object execute(SqlS ...
 - java中方法内可以调用同一个类中的方法
		
在同一个类中,java的普通方法的相互调用,可以使用this+点号+方法名,也可省略this+点号,java编 译器会自动补上.
 - mapper文件中“添加一条新数据并返回此数据的ID(主键)”的方法
		
在mapper文件的insert语句前加上<selectKey>标签即可 如下: 添加前测试: 添加后测试:
 - mysql5.7安装中的问题(服务无法启动。服务没有报告任何错误。排查方法)
		
1.拒绝访问的问题 权限不够,必须以管理员身份启动命令行 2.MySQL 服务无法启动.服务没有报告任何错误. 进入到你的mysql安装目录,C:\Program Files\MySQL\MySQL ...
 
随机推荐
- arcgis导oracle多步操作产生错误。请检查每一步的状态值。" 如何解决?
			
你知你用的什么数据引擎,ADO? 我以前碰过类似的,我有两个方案: 1.升ado到2.7以上 2.不要用microsoft oledb provider for oracle,而要用or ...
 - spring-boot:run启动时,指定spring.profiles.active
			
Maven启动指定Profile通过-P,如mvn spring-boot:run -Ptest,但这是Maven的Profile. 如果要指定spring-boot的spring.profiles. ...
 - 明星伙伴第一至八季/全集Entourage迅雷下载
			
英文译名Entourage,第1-8季(04-2011)HBO.本季看点:<明星伙伴>这是一部HBO原创系列喜剧,讲述年少成名的男主人公文森 .蔡斯和他的三个少年时纽约皇后区的朋友一道冒险 ...
 - 低版本系统兼容的ActionBar(五)修改ActionBar的全套样式,从未如此简单过
			
设定ActionBar的样式,是我们必须掌握的技能,在之前我们可能都需要一行一行的写代码,然后在模拟器上测试效果,但是现在我们有个一个很棒的工具来设定样式.设定ActionBar样式的工作从 ...
 - cat、tac、rev、nl命令
			
当日志文件log.log很长,但又要按内容从后往前查看时,可以使用如下命令: tac log.log | more cat 由第一行开始显示内容,并将所有内容输出 tac 从最后 ...
 - [转]mysql变量使用总结
			
From : http://www.cnblogs.com/wangtao_20/archive/2011/02/21/1959734.html set语句的学习: 使用select定义用户变量的实践 ...
 - Netty Message RefCount
			
ByteBuf is always reference counted To control the life cycle of a ByteBuf in a more predictable way ...
 - C++对带有分隔符的字符串 分割为数字的通用解决方案
			
需求: 数据库取出的字段类似于 "1,3,4" 然后用数字处理后,,比如 "1,2,3" 再存回去 #include<stdio.h> #inclu ...
 - go语言之进阶篇 select实现的超时机制
			
1.select实现的超时机制 示例: package main import ( "fmt" "time" ) func main() { ch := mak ...
 - ESP32那些事儿(六):功能开发之蓝牙及WiFi功能
			
蓝牙和WIFI是ESP32的核心功能,蓝牙和wifi的共存也是esp32的独门武功,但时候后续也会发现共存的时候会有很多问题.不管怎样,蓝牙和wifi在esp-idf中有很多的例子,大家都可以参考.本 ...