.NET使用AutoResetEvent实现多线程打印奇偶数
AutoResetEvent 类 (System.Threading) | Microsoft Docs
定义
命名空间:
程序集:
mscorlib.dll, System.Threading.dll
表示线程同步事件在一个等待线程释放后收到信号时自动重置。 此类不能被继承。
注解
线程通过调用 AutoResetEvent 等待信号。 如果 AutoResetEvent 处于非终止状态,则线程将会阻塞,直到调用 AutoResetEvent 调用 Set 方法向阻塞线程发送可用信号, AutoResetEvent 以释放等待线程。
AutoResetEvent 在一个等待线程释放之前保持终止状态,然后自动返回到非终止状态。 如果没有等待的线程,状态将保持无限期通知。
如果线程 WaitOne AutoResetEvent 在处于终止状态时调用,则线程不会阻塞。 AutoResetEvent立即释放该线程并返回到非终止状态。
AutoResetEvent 可以通过将布尔值传递到构造函数来控制的初始状态:
若要将初始状态设置为终止,则为 true;若要将初始状态设置为非终止,则为 false。
AutoResetEvent 还可与 static WaitAll 和方法一起使用 WaitAny 。
从 .NET Framework 版本2.0 开始, AutoResetEvent 派生自新 EventWaitHandle 类。 AutoResetEvent在功能上等效于 EventWaitHandle 使用创建的 EventResetMode.AutoReset 。
示例
功能:
定义两个线程,从1打印到100,一个线程打印奇数,一个线程打印偶数。
实现:
奇数线程,设置奇数锁等待WiatOne,打印完成后,向偶数锁发送Set
偶数线程,设置偶数锁等待WiatOne,打印完成后,向奇数锁发送Set
调用AutoResetEvent 的Set方法使奇数线程先执行
代码:
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp
{
class Program
{
//定义两个信号锁
public static AutoResetEvent even = new AutoResetEvent(false);
public static AutoResetEvent odd = new AutoResetEvent(false);
static void Main(string[] args)
{
Thread even_thread = new Thread(() =>
{
for (int i = 1; i <= 100; i++)
{
if (i % 2 == 0)
{
even.WaitOne();//设置偶数线程等待
Console.WriteLine($"{Thread.CurrentThread.Name} {i}");
odd.Set();//向奇数线程发送可用信号
}
}
});
even_thread.Name = $"Thread_even";
even_thread.Start();
Thread odd_thread = new Thread(() =>
{
for (int i = 1; i <= 100; i++)
{
if (i % 2 != 0)
{
odd.WaitOne();//设置奇数线程等地
Console.WriteLine($"{Thread.CurrentThread.Name} {i}");
even.Set();//向偶数线程发送可用信号
}
}
});
odd_thread.Name = $"Thread_odd";
odd_thread.Start();
odd.Set();//奇数线程先运行
Console.ReadKey();
Console.WriteLine("End...");
}
}
}
输出结果:

.NET使用AutoResetEvent实现多线程打印奇偶数的更多相关文章
- Java 实现多线程切换等待唤醒交替打印奇偶数
引言 在日常工作生活中,可能会有用时几个人或是很多人干同一件事,在java编程中,同样也会出现类似的情况,多个线程干同样一个活儿,比如火车站买票系统不能多个人买一到的是同一张票,当某个窗口(线程)在卖 ...
- [Java并发]实现两个线程交替打印奇偶数(volatile+yield实现)
解题思路 实现一个类OddEven 有一个打印奇数的方法,有一个打印偶数的方法. 类中有一个volatile变量 ,用来控制当前状态是该哪个方法打印. 方法中打印每个数前首先判断volatile变量的 ...
- 两个线程交替打印奇偶数【Lock版】
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public clas ...
- LeetCode:打印零与奇偶数【1116】
LeetCode:打印零与奇偶数[1116] 题目描述 假设有这么一个类: class ZeroEvenOdd { public ZeroEvenOdd(int n) { ... } // 构造函数 ...
- PHP获取数组中奇偶数
获取PHP数组中的奇偶数,可通过数组过滤函数array_filter(),看定义:该函数把输入数组中的每个键值传给回调函数.如果回调函数返回 true,则把输入数组中的当前键值返回结果数组中.数组键名 ...
- Java面试题之多线程打印
概述 作为程序员经常在面试的时候遇到多线程的问题,我印象比较深刻的就是下面这道题:写两个线程,一个线程打印 1~52,另一个线程打印字母A-Z.打印顺序为12A34B56C……5152Z.看这个题目已 ...
- log4j2 异步多线程打印日志
log4j2 异步多线程打印日志 Maven依赖 <dependency> <groupId>org.apache.logging.log4j</groupId> ...
- java面试题:多线程交替输出偶数和奇数
一个面试题:实现两个线程A,B交替输出偶数和奇数 问题:创建两个线程A和B,让他们交替打印0到100的所有整数,其中A线程打印偶数,B线程打印奇数 这个问题配合java的多线程,很多种实现方式 在具体 ...
- 9月13日JavaScript语句循环(100以备奇偶数、100以内与7先关的数、100以内整数的和、10以内阶乘、乘法口诀、篮球弹起高度、64格子放东西)
3.循环 循环是操作某一个功能(执行某段代码). ①循环四要素: a 循环初始值 b 循环的条件 c 循环状态 d 循环体 ②for循环 a 穷举:把所有的可能性的都一一列出来. b 迭代:每次循环都 ...
随机推荐
- Java学习的第三十三天
1.今天复习了第十二章的12.1的文件和12.2一直到12.2.4 2.没有问题 3.明天继续复习
- 深入探究ASP.NET Core Startup初始化
前言 Startup类相信大家都比较熟悉,在我们使用ASP.NET Core开发过程中经常用到的类,我们通常使用它进行IOC服务注册,配置中间件信息等.虽然它不是必须的,但是将这些操作统一在Start ...
- Java才是世界上最好的语言,Java在高频交易中替代C++
高频交易 高频交易是指从那些人们无法利用的极为短暂的市场变化中寻求获利的计算机化交易,比如,某种证券买入价和卖出价差价的微小变化,或者某只股票在不同交易所之间的微小价差.在高频交易中,自动化应用程序每 ...
- 利用sklearn实现knn
基于上面一篇博客k-近邻利用sklearns实现knn #!/usr/bin/env python # coding: utf-8 # In[1]: import numpy as np import ...
- 面试题:对NotNull字段插入Null值 有啥现象?
Hi,大家好!我是白日梦. 今天我要跟你分享的话题是:"对NotNull字段插入Null值有啥现象?" 一. 推荐阅读 首发地址:https://mp.weixin.qq.com/ ...
- Java多线程技术:实现多用户服务端Socket通信
目录 前言回顾 一.多用户服务器 二.使用线程池实现服务端多线程 1.单线程版本 2.多线程版本 三.多用户与服务端通信演示 四.多用户服务器完整代码 最后 前言回顾 在上一篇<Java多线程实 ...
- Cephfs的快照功能
前言 Cephfs的快照功能在官网都很少提及,因为即使开发了很多年,但是由于cephfs的复杂性,功能一直没能达到稳定,这里,只是介绍一下这个功能,怎么使用,并且建议不要在生产中使用,因为搞不好是会丢 ...
- 医学AI论文解读 |Circulation|2018| 超声心动图的全自动检测在临床上的应用
文章来自微信公众号:机器学习炼丹术.号主炼丹兄WX:cyx645016617.文章有问题或者想交流的话欢迎- 参考目录: @ 目录 0 论文 1 概述 2 pipeline 3 技术细节 3.1 预处 ...
- JVM全方位解读(附面试题)
java中就虚拟机是其他语言编写的(C语言+汇编语言,因此,JVM最常出现的攻击就是buffer overflow),如javac命令等,而java api是java写的,大多开源在openjdk,j ...
- 微信_跳一跳辅助程序_Python_(带GitHub项目地址)
1.安装Python(推荐3.6) https://www.python.org/downloads/ 2.在github上下载脚本 [github项目地址](https://github.com/w ...