zoukankan      html  css  js  c++  java
  • ManualResetEvent用法

    ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。

    public static ManualResetEvent mre = new ManualResetEvent(false);
    ManualResetEvent建立时是把false作为start的初始状态,这个类用于通知另一个线程,让它等待一个或多个线程。注意,为了通知或监听同一个线程,所有的其它线程都能访问那个类。
    等待线程这样写:
      mre.WaitOne();
    这将引起等待线程无限期的阻塞并等待类来通知。
    发信号的线程应该这样:
      mre.Set();
    这样类就会被通知,值变成true,等待线程就会停止等待。在通知事件发生后,我们就可以使用下面语句把线程置于非终止状态,导致线程阻止:
      mre.Reset();
    一个测试的例子:

    using System;
    using System.Threading;
    namespace ThreadingTester
    {
        
    class ThreadClass
        
    {
            
    public static ManualResetEvent mre = new ManualResetEvent(false);
            
    public static void trmain()
            
    {
                Thread tr 
    = Thread.CurrentThread;
                Console.WriteLine(
    "thread: waiting for an event");
                mre.WaitOne();
                Console.WriteLine(
    "thread: got an event");
                
    for (int x = 0; x < 10; x++)
                
    {
                    Thread.Sleep(
    1000);
                    mre.WaitOne();
                    Console.WriteLine(tr.Name 
    + "" + x);
                }

            }

            
    static void Main(string[] args)
            
    {
                Thread thrd1 
    = new Thread(new ThreadStart(trmain));
                thrd1.Name 
    = "thread1";
                thrd1.Start();
                
    for (int x = 0; x < 10; x++)
                
    {
                    Thread.Sleep(
    900);
                    Console.WriteLine(
    "Main:" + x);
                    
    if (5 == x) mre.Set();
                    
    if (6 == x) mre.Reset();
                    
    if (8 == x) mre.Set();
                }

                
    while (thrd1.IsAlive)
                
    {
                    Thread.Sleep(
    1000);
                    Console.WriteLine(
    "Main: waiting for thread to stop");
                }

            }

        }

    }

    运行的结果为:
    thread: waiting for an event
    Main:0
    Main:1
    Main:2
    Main:3
    Main:4
    Main:5
    thread: got an event
    Main:6
    Main:7
    Main:8
    thread1: 0
    Main:9
    thread1: 1
    Main: waiting for thread to stop
    thread1: 2
    Main: waiting for thread to stop
    thread1: 3
    Main: waiting for thread to stop
    thread1: 4
    Main: waiting for thread to stop
    thread1: 5
    Main: waiting for thread to stop
    thread1: 6
    Main: waiting for thread to stop
    thread1: 7
    Main: waiting for thread to stop
    thread1: 8
    Main: waiting for thread to stop
    thread1: 9
    Main: waiting for thread to stop
  • 相关阅读:
    POJ 1269 Intersecting Lines --计算几何
    URAL 2014 Zhenya moves from parents --线段树
    HDU 4122 Alice's mooncake shop --RMQ
    HDU 4121 Xiangqi --模拟
    HDU 4045 Machine scheduling --第二类Strling数
    HDU 4041 Eliminate Witches! --模拟
    HDU 5105 Math Problem --数学,求导
    2014-2015 Codeforces Trainings Season 2 Episode 7 G Gophers --线段树
    HDU 4419 Colourful Rectangle --离散化+线段树扫描线
    HDU 5102 The K-th Distance
  • 原文地址:https://www.cnblogs.com/fengfeng/p/1229037.html
Copyright © 2011-2022 走看看