详解 ManualResetEvent
全栈程序员-用户IM • 2022年7月3日 下午2:36 • 未分类
详解 ManualResetEvent今天详细说一下ManualResetEvent它可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源当一个线程开始一个活动(此活动必须完成后,其他线程才能
大家好,又见面了,我是你们的朋友全栈君。
今天详细说一下ManualResetEvent
它可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源
Reset 以将 ManualResetEvent 置于非终止状态。ManualResetEvent 。ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。
ManualResetEvent 将保持终止状态,直到它被手动重置。WaitOne 的调用将立即返回。
ManualResetEventDemo.rar
ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true ;否则为 false 。
class Program
{
static ManualResetEvent _mre = new ManualResetEvent(false);
static void Main(string[] args)
{
Thread[] _threads = new Thread[3];
for (int i = 0; i < _threads.Count(); i++)
{
_threads[i] = new Thread(ThreadRun);
_threads[i].Start();
}
}
static void ThreadRun()
{
int _threadID = 0;
while (true)
{
_mre.WaitOne();
_threadID = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine("current Tread is " + _threadID);
Thread.Sleep(TimeSpan.FromSeconds(2));
}
}
}
当初始化为true时,为终止状态
static ManualResetEvent _mre = new ManualResetEvent(true);
执行结果
当初始化为false时,为非终止状态
static ManualResetEvent _mre = new ManualResetEvent(false);
执行结果为
这样我们就能看出来
终止状态时 WaitOne()允许线程访问下边的语句
非终止状态时 WaitOne()阻塞线程,不允许线程访问下边的语句
我们也可以把WaitOne()放在方法最下边
static void ThreadRun()
{
int _threadID = 0;
while (true)
{
_threadID = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine("current Tread is " + _threadID);
Thread.Sleep(TimeSpan.FromSeconds(2));
_mre.WaitOne();
}
}
当初始化为true时执行结果和上边的一样会不停的执行
初始化为false时执行到waitOne()时就阻塞线程不会再往下执行了
接下来你可能就会想当在非终止状态时怎么让线程继续执行,怎么再让它停下来 ,这就要用了set()和Reset()方法了
把非终止状态改为终止状态用Set()方法
把终止状态改为非终止状态用Reset()方法
我用用代码来实现它们只要把我们上 边的代码做一下改动
class Program
{
static ManualResetEvent _mre = new ManualResetEvent(false);
static void Main(string[] args)
{
Console.WriteLine("输入1为Set() 开始运行");
Console.WriteLine("输入2为Reset() 暂停运行");
Thread[] _threads = new Thread[3];
for (int i = 0; i < _threads.Count(); i++)
{
_threads[i] = new Thread(ThreadRun);
_threads[i].Start();
}
while (true)
{
switch (Console.ReadLine())
{
case "1":
_mre.Set();
Console.WriteLine("开始运行");
break;
case "2":
_mre.Reset();
Console.WriteLine("暂停运行");
break;
default:
break;
}
}
}
static void ThreadRun()
{
int _threadID = 0;
while (true)
{
_threadID = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine("current Tread is " + _threadID);
Thread.Sleep(TimeSpan.FromSeconds(2));
_mre.WaitOne();
}
}
}
当输入1 时会调用 Set()方法 ManualResetEvent 处于终止状态会WaitOne不会阻塞线程会一直运行下去
当输入2时会调用 Reser()方法ManualResetEvent处于非终止状态WaitOne会阻塞线程直到再调用 Set()方法
看一下执行结果吧
ManualResetEventDemo.rar
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/155674.html 原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...