.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 迭代:每次循环都 ...
随机推荐
- 冷饭新炒:理解断路器CircuitBreaker的原理与实现
前提 笔者之前在查找Sentinel相关资料的时候,偶然中找到了Martin Fowler大神的一篇文章<CircuitBreaker>.于是花了点时间仔细阅读,顺便温习一下断路器Circ ...
- idea 远程debug springboot
idea 远程debug springboot 1.新建一个springboot工程. 新建一个controller接口 @RestController @RequestMapping public ...
- Serilog 源码解析——Sink 的实现
在上一篇中,我们简单地查看了 Serilog 的整体需求和大体结构.从这一篇开始,本文开始涉及 Serilog 内的相关实现,着重解决第一个问题,即 Serilog 向哪里写入日志数据的.(系列目录) ...
- Loading descriptor for XXX.'has encountered a problem' A internal error occured during:"Loading ....."
在JavaWeb部署Tomcat后启动Jsp发现这样的报错 这可能是Tomcat的运行欢迎有问题,按下图所示打开Tomcat界面.Servers目录就是当前工作空间对所有工程适用的的Tomcat环境, ...
- [python学习手册-笔记]001.python前言
001.python前言 ❝ 本系列文章是我个人学习<python学习手册(第五版)>的学习笔记,其中大部分内容为该书的总结和个人理解,小部分内容为相关知识点的扩展. 非商业用途转载请注明 ...
- sdasd
create PROCEDURE v4(in c_year int) BEGIN declare num int(10) default 0; declare num1 int(10); select ...
- java中在构造方法中修改线程名,修改失败原因(现已修改成功)
package com.cx.Threads; public class HelloThread extends Thread{ @Override public void run() { for ( ...
- VMware虚拟机 - 解决 Vmware 启动虚拟机报:该虚拟机似乎正在使用中。 如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权。否则,请按“取消(C)”按钮以防损坏的问题
问题背景 当虚拟机仍然在运行时,直接关闭电脑,下次重开电脑并想重新启动虚拟机时报了下图问题 解决方案 进入虚拟机所在目录,把 .lck 后缀的文件都删完 Vmware 重新启动虚拟机 成功!!
- 虚拟DOM与diff算法
虚拟DOM与diff算法 虚拟DOM 在DOM操作中哪怕我们的数据,发生了一丢丢的变化,也会被强制重建整预DOM树.这么做,涉及到很多元素的重绘和重排,导致性能浪费严重 只要实现按需更新页面上的元素即 ...
- 8.java设计模式之装饰者模式
基本需求: 咖啡的种类有很多种,调料也有很多种,下单时,可以点单品咖啡也可以点单品咖啡+调料的组合,并计算下单时花费的金额 传统方式: 方式一 创建一个抽象类Drink,让所有的单品咖啡和组合咖啡都继 ...