ManualResetEvent详解

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

1. 源码下载:

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

Demo:

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();

                }

            }

            

        }

    }

}

时间: 2024-08-06 22:09:39

ManualResetEvent详解的相关文章

AutoResetEvent和ManualResetEvent详解

AutoResetEvent 允许线程通过发信号互相通信.通常,此通信涉及线程需要独占访问的资源. 线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号.如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程 通过调用 Set 发出资源可用的信号. 调用 Set 向 AutoResetEvent 发信号以释放等待线程.AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态.如果没有任何线程在等

Spring事务管理(详解+实例)

写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都

转载:DenseNet算法详解

原文连接:http://blog.csdn.net/u014380165/article/details/75142664 参考连接:http://blog.csdn.net/u012938704/article/details/53468483 本文这里仅当学习笔记使用,具体细节建议前往原文细度. 论文:Densely Connected Convolutional Networks 论文链接:https://arxiv.org/pdf/1608.06993.pdf 代码的github链接:h

MariaDB(MySQL)创建、删除、选择及数据类型使用详解

一.MariaDB简介(MySQL简介略过) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品.在存储引擎方面,使用XtraDB(英语:XtraDB)来代替MySQL的InnoDB. MariaDB由MySQL的创始人Michael Widenius(英语:Michael Widenius)主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL A

HttpServletResponse和HttpServletRequest详解

HttpServletResponse,HttpServletRequest详解 1.相关的接口 HttpServletRequest HttpServletRequest接口最常用的方法就是获得请求中的参数,这些参数一般是客户端表单中的数据.同时,HttpServletRequest接口可以获取由客户端传送的名称,也可以获取产生请求并且接收请求的服务器端主机名及IP地址,还可以获取客户端正在使用的通信协议等信息.下表是接口HttpServletRequest的常用方法. 说明:HttpServ

POSIX 线程详解(经典必看)

总共三部分: 第一部分:POSIX 线程详解                                   Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  2000 年 7 月 01 日 第二部分:通用线程:POSIX 线程详解,第 2部分       Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  20

.NET深入解析LINQ框架(五:IQueryable、IQueryProvider接口详解)

阅读目录: 1.环路执行对象模型.碎片化执行模型(假递归式调用) 2.N层对象执行模型(纵横向对比链式扩展方法) 3.LINQ查询表达式和链式查询方法其实都是空壳子 4.详细的对象结构图(对象的执行原理) 5.IQueryable<T>与IQueryProvider一对一的关系能否改成一对多的关系 6.完整的自定义查询 1]. 环路执行对象模型.碎片化执行模型(假递归式调用) 这个主题扯的可能有点远,但是它关系着整个LINQ框架的设计结构,至少在我还没有搞懂LINQ的本意之前,在我脑海里一直频

netstat状态详解

一.生产服务器netstat tcp连接状态................................................................................ 2 1.1生产服务器某个业务LVS负载均衡上连接状态数量............................................... 2 1.2生产服务器某个业务web上连接状态数量...............................................

详解go语言的array和slice 【二】

上一篇  详解go语言的array和slice [一]已经讲解过,array和slice的一些基本用法,使用array和slice时需要注意的地方,特别是slice需要注意的地方比较多.上一篇的最后讲解到创建新的slice时使用第三个索引来限制slice的容量,在操作新slice时,如果新slice的容量大于长度时,添加新元素依然后使源的相应元素改变.这一篇里我会讲解到如何避免这些问题,以及迭代.和做为方法参数方面的知识点. slice的长度和容量设置为同一个值 如果在创建新的slice时我们把