Mega Code Archive

 
Categories / C# / Thread
 

Use Wait() and Pulse() to create a ticking clock

/* C#: The Complete Reference  by Herbert Schildt  Publisher: Osborne/McGraw-Hill (March 8, 2002) ISBN: 0072134852 */ // Use Wait() and Pulse() to create a ticking clock.    using System;  using System.Threading;    class TickTock {      public void tick(bool running) {      lock(this) {        if(!running) { // stop the clock          Monitor.Pulse(this); // notify any waiting threads          return;        }          Console.Write("Tick ");        Monitor.Pulse(this); // let tock() run            Monitor.Wait(this); // wait for tock() to complete      }    }      public void tock(bool running) {      lock(this) {        if(!running) { // stop the clock          Monitor.Pulse(this); // notify any waiting threads          return;        }          Console.WriteLine("Tock");        Monitor.Pulse(this); // let tick() run          Monitor.Wait(this); // wait for tick to complete      }    }  }     class MyThread {    public Thread thrd;    TickTock ttOb;      // Construct a new thread.    public MyThread(string name, TickTock tt) {      thrd = new Thread(new ThreadStart(this.run));      ttOb = tt;      thrd.Name = name;      thrd.Start();     }      // Begin execution of new thread.    void run() {      if(thrd.Name == "Tick") {        for(int i=0; i<5; i++) ttOb.tick(true);        ttOb.tick(false);      }      else {        for(int i=0; i<5; i++) ttOb.tock(true);        ttOb.tock(false);      }    }  }    public class TickingClock {    public static void Main() {      TickTock tt = new TickTock();      MyThread mt1 = new MyThread("Tick", tt);      MyThread mt2 = new MyThread("Tock", tt);        mt1.thrd.Join();      mt2.thrd.Join();      Console.WriteLine("Clock Stopped");    }  }