ManualResetEvent详解

ManualResetEvent详解原文来自:http://www.cnblogs.com/tianzhiliang/archive/2011/03/04/1970726.html1.源码下载:下载地址:http://files.cnblogs.com/tianzhiliang/ManualResetEventDemo.rarDemo:2.ManualResetEvent详解…

大家好,又见面了,我是你们的朋友全栈君。

原文来自:http://www.cnblogs.com/tianzhiliang/archive/2011/03/04/1970726.html

1. 源码下载:

    下载地址:http://files.cnblogs.com/tianzhiliang/ManualResetEventDemo.rar

    Demo:

ManualResetEvent详解

2. ManualResetEvent详解

    ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态,此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。

?
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.Threading;
 
namespace
ManualResetEventDemo
{
    
class
MREDemo
    
{
        
private
ManualResetEvent _mre;
 
        
public
MREDemo()
        
{
            
this
._mre =
new
ManualResetEvent(
true
);
        
}
 
        
public
void
CreateThreads()
        
{
            
Thread t1 =
new
Thread(
new
ThreadStart(Run));
            
t1.Start();
 
            
Thread t2 =
new
Thread(
new
ThreadStart(Run));
            
t2.Start();
        
}
 
        
public
void
Set()
        
{
            
this
._mre.Set();
        
}
 
        
public
void
Reset()
        
{
            
this
._mre.Reset();
        
}
 
        
private
void
Run()
        
{
            
string
strThreadID =
string
.Empty;
            
try
            
{
                
while
(
true
)
                
{
                    
// 阻塞当前线程
                    
this
._mre.WaitOne();
 
                    
strThreadID = Thread.CurrentThread.ManagedThreadId.ToString();
                    
Console.WriteLine(
"Thread("
+ strThreadID +
") is running..."
);
 
                    
Thread.Sleep(5000);
                
}
            
}
            
catch
(Exception ex)
            
{
                
Console.WriteLine(
"线程("
+ strThreadID +
")发生异常!错误描述:"
+ ex.Message.ToString());
            
}
        
}
 
    
}
}

 

?
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
 
namespace
ManualResetEventDemo
{
    
class
Program
    
{
        
static
void
Main(
string
[] args)
        
{
            
Console.WriteLine(
"****************************"
);
            
Console.WriteLine(
"输入\"stop\"停止线程运行..."
);
            
Console.WriteLine(
"输入\"run\"开启线程运行..."
);
            
Console.WriteLine(
"****************************\r\n"
);
 
            
MREDemo objMRE =
new
MREDemo();
            
objMRE.CreateThreads();
 
            
while
(
true
)
            
{
                
string
input = Console.ReadLine();
                
if
(input.Trim().ToLower() ==
"stop"
)
                
{
                    
Console.WriteLine(
"线程已停止运行..."
);
                    
objMRE.Reset();
                
}
                
else
if
(input.Trim().ToLower() ==
"run"
)
                
{
                    
Console.WriteLine(
"线程开启运行..."
);
                    
objMRE.Set();
                
}
            
}
             
        
}
    
}
}

转载于:https://www.cnblogs.com/nele/p/5552451.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161167.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • es6延展操作符_一行代码实现数组去重

    es6延展操作符_一行代码实现数组去重es6之扩展运算符三个点(…)es6之扩展运算符三个点(…)对象的扩展运算符数组的扩展运算符总结es6之扩展运算符三个点(…)对象的扩展运算符理解对象的扩展运算符其实很简单,只要记住一句话就可以:对象中的扩展运算符(…)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中letbar={a:1,b:2};letbaz={…z};/…

    2022年4月19日
    118
  • 如何使用Python读取大文件

    如何使用Python读取大文件

    2021年11月26日
    48
  • pycharm中python interpreter怎么设置_pycharm显示interpreter

    pycharm中python interpreter怎么设置_pycharm显示interpreter1.File–》Settings–》Project—-》ProjectInterpreter—》ShowAll(下拉列表中选择)2.点击加号+ —->SystemInterpreter(一定要选择这个阿)–点击OK即可3.备注下:不想要的版本点击减号-进行删除即可…

    2022年8月26日
    32
  • 分布式锁的使用场景_分布式锁的三种实现的对比

    分布式锁的使用场景_分布式锁的三种实现的对比前言对于锁大家肯定不会陌生,比如synchronized关键字和ReentrantLock可重入锁,一般我们用其在多线程环境中控制对资源的并发访问。但是随着业务的发展,分布式的概念逐渐出现在我们系统中,我们在开发的过程中经常需要进行多个系统之间的交互,于是上面的加锁方法就会失去作用。于是在分布式锁就自然而然的诞生了,接下来我们来聊一聊分布式锁实现的几种方式。分布式锁的使用场景 效率性:使用分布式锁可以避免不同节点重复相同的工作。 正确性:分布式锁可以避免破坏正确性的发生,如

    2022年9月8日
    0
  • 华为裁员风波,网络一片骂声!然而,没人懂华为的无奈「建议收藏」

    华为裁员风波,网络一片骂声!然而,没人懂华为的无奈「建议收藏」毫无疑问,今天各大媒体的头条都是华为裁员。任正非&华为《任正非:华为不奋斗就垮了,不可能养不奋斗者!》一文在朋友圈刷屏,各微信群都能看到这篇文章的身影,而今日头条等各新闻客户端的首页推荐、科技等频道充斥着“华为裁员”字眼的标题。网友对此的反映也基本一致——怒斥华为对老臣子的不公对待,压榨员工。网友的抨击然而,大部分人都没看到华为的无奈

    2022年7月18日
    41
  • 【工具使用】应用层DNS协议工具—iodine

    【工具使用】应用层DNS协议工具—iodine0x01iodine 工具介绍 iodine 工具是基于 C 语言开发的 分为服务端程序 iodined 和客户端 iodine iodine 支持 EDNS base32 base64 base128 等多种编码规范 iodine 支持转发模式和中继模式 iodine 原理 通过 TAP 虚拟网卡 在服务端建立一个局域网 在客户端 通过 TAP 建立一个虚拟网卡 两者通过 DNS 隧道连接 处于同一局域网 可以通过 ping 命令通信 在客户端和服务端之间建立连接后 客户机上会多出一块 dns0 的虚拟网卡 DNS 隧道

    2025年6月21日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号