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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • linux 文件锁

    linux 文件锁1.文件锁基本概念Linux中软件、硬件资源都是文件(一切皆文件),文件在多用户环境中是可共享的。文件锁是用于解决资源的共享使用的一种机制:当多个用户需要共享一个文件时,Linux通常采用的方法是给文件上锁,来避免共享的资源产生竞争的状态。文件锁包括建议性锁和强制性锁:建议性锁:要求每个使用上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。在一般情况下,内核和系统都不使用建议性锁,它们依靠程序员遵守这个规定。强制性锁:是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他任何

  • mt4软件下载使用_安卓手机如何下载mt4

    mt4软件下载使用_安卓手机如何下载mt4现在要投资理财非常的方便,投资者只要通过交易软件就可以线上完成这个过程。不得不承认,一款好的交易软件确实能让投资者获得更好的体验,而一款品质较差的软件不仅会让交易不顺,甚至会让投资者错失盈利机会。目前市面上主流的交易软件就是mt4,那mt4软件怎么选对下载方式?在正规安全平台下载mt4软件mt4的下载方式很多,一些没有经验的投资者可能会“下错”软件,比如在一些正规性上存在问题的网站下载了mt4软件,这就很有可能会使自己的交易暴露在严重的风险中。那正版mt4。cnca。ink软件在哪里下载更安全呢?为了避

  • 实验室设备管理系统c语言程序设计_设备管理系统怎么实现

    实验室设备管理系统c语言程序设计_设备管理系统怎么实现#include#include#includetypedefstructequipment{intnum;//编号charname[20];//名称charmodel[20];//型号charfactory[20];//厂家charbuy_date[20];//购买日期struc

    2022年10月13日
  • 海量数据处理技巧

    海量数据处理技巧数据时代来临,数据量的爆炸式增长是最为显著的特征。当高性能硬件的普及还跟不上这样的数据大潮时,如何在有限的时空资源内处理海量数据成为了计算机科学以及数理统计等领域最大的挑战。所谓“数据处理”,在本文中特指通过计算机技术,对海量数据进行存储、统计、查询等操作。我将在下面介绍一些基本的海量数据处理的方法,供大家参考。需要明确的一点是,现实情况复杂多变,所以对于海量数据处理这样大的主题,是不可能用一…

  • QT中this指针

    QT中this指针一:this指针只能在一个类的成员函数中调用,它表示当前对象的地址。下面是一个例子: void Date::setMonth( int mn) { month=mn; // 这三句是等价的 this->month=mn; (*this).month=mn; }1.this只能在成员函数中使用。全局函数,静态函数都不能使用th

  • 虚拟化实践:云桌面安装

    虚拟化实践:云桌面安装

发表回复

您的电子邮箱地址不会被公开。

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