添加三个线程同时启动执行某一方法,并依次调用某方法中的打印输: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#中添加三个线程同时启动执行某一方法,并依次调用某方法中的循环打印输。的更多相关文章

  1. hibernate中保存一个对象后再设置此对象的属性为什么不需要调用update方法了

    hibernate中保存一个对象后再设置此对象的属性为什么不需要调用update方法了 例如session.save(user);user.setAge(20); 原因: hibernate对象的三种 ...

  2. 在IE中,JS方法名和input的name重名时,调用该方法无效

    在IE中,JS方法名和input的name重名时,调用该方法无效.提示:网页错误详细信息 用户代理: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1 ...

  3. Replication基础(六) 复制中的三个线程(IO/SQL/Dump)

    Reference:  https://blog.csdn.net/sun_ashe/article/details/82181811?utm_source=blogxgwz1 简介在MySQL复制技 ...

  4. 三个线程abc顺序执行

    1.使用synchronized悲观锁(秋招阿里的一个笔试题,应该写的比较复杂,然后就没有然后了o(╥﹏╥)o) public class ThreadThreadp { private int fl ...

  5. Mybaits 源码解析 (七)----- Select 语句的执行过程分析(下篇)(Mapper方法是如何调用到XML中的SQL的?)全网最详细,没有之一

    我们上篇文章讲到了查询方法里面的doQuery方法,这里面就是调用JDBC的API了,其中的逻辑比较复杂,我们这边文章来讲,先看看我们上篇文章分析的地方 SimpleExecutor public & ...

  6. Mybaits 源码解析 (六)----- 全网最详细:Select 语句的执行过程分析(上篇)(Mapper方法是如何调用到XML中的SQL的?)

    上一篇我们分析了Mapper接口代理类的生成,本篇接着分析是如何调用到XML中的SQL 我们回顾一下MapperMethod 的execute方法 public Object execute(SqlS ...

  7. java中方法内可以调用同一个类中的方法

    在同一个类中,java的普通方法的相互调用,可以使用this+点号+方法名,也可省略this+点号,java编 译器会自动补上.

  8. mapper文件中“添加一条新数据并返回此数据的ID(主键)”的方法

    在mapper文件的insert语句前加上<selectKey>标签即可 如下: 添加前测试: 添加后测试:

  9. mysql5.7安装中的问题(服务无法启动。服务没有报告任何错误。排查方法)

    1.拒绝访问的问题 权限不够,必须以管理员身份启动命令行 2.MySQL 服务无法启动.服务没有报告任何错误. 进入到你的mysql安装目录,C:\Program Files\MySQL\MySQL ...

随机推荐

  1. iOS关于error can't allocate region的一点发现

    调试的时候出现error can't allocate region错误,后来去搜了下网上关于这个错误的帖子,是这么说的:error can't allocate region 程序运行报错,在xco ...

  2. Fidder发送Get、POST请求

      Composer:   1.Get请求 a) 请求头加上: Content-Type: application/json; charset=utf-8   b) url:http://localh ...

  3. Node.js + Express 构建的订餐系统

    Node.js的版本 - v0.8.12 Express的版本 – v3.3.3  (安装 $ npm install -g express) 系统的登录逻辑是:获取用户名 + 密码,向内网RTX服务 ...

  4. ViewFlipper的简单用法

    ViewFlipper和ViewPager挺像的,都是一个view容器.内部可以添加多个view,只是viewpager可以通过左右滑动来切换view,而viewFlipper则没有这个功能,所以需要 ...

  5. 《Linux就是这个范儿》

    <Linux就是这个范儿> 基本信息 作者: 赵鑫磊    (加)Jie Zhang(张洁) 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115359360 上架时间:2 ...

  6. java常见反编译工具

    1.Java反编译插件 —— Jadclipse JadClipse是Jad的Eclipse插件,是一款非常实用而且方便地Java反编译插件,我们只需将下载的插件包复制到eclipse的plugins ...

  7. [转]pear windows 安装

    FROM : http://jingyan.baidu.com/article/ca41422fd8cf3d1eae99ed3e.html 因为想使用phpdocument生成文档,不得不安装pear ...

  8. 升级Https前的可行性验证(一)

    升级Https之前的可行性验证 注意:自签证书和Nginx的安装都基于ContOS 6 一.如何申请OpenSSL自签证书 1.安装OpenSSL (一)OpenSSL 工具下载 下载地址 (二)Op ...

  9. Generate Parentheses leetcode java

    题目: Given n pairs of parentheses, write a function to generate all combinations of well-formed paren ...

  10. CentOS7安装openjdk、tomcat和mysql流程介绍

    首先是前戏,推荐一个远程工具Xshell和Xftp搭配使用,以下是Xshell的官网 http://www.netsarang.com/products/xsh_overview.html 1.ope ...