Пример использования методов Wait () и Pulse ()
Для тогочтобы стало понятнее назначение методовWait() иPulse(), рассмотрим пример программы, имитирующей тиканье часов и отображающей этот процесс на экране словами "тик" и "так". Для этой цели в программе создается классTickTock,содержащий два следующих метода:Tick()иТоск().МетодTick() выводит на экран слово "тик", а методТоск () — слово "так". Для запуска часов далее в программе создаются два потока: один из них вызывает методTick(), а другой — методТоск(). Преследуемая в данном случае цель состоит в том, чтобы оба потока выполнялись, поочередно выводя на экран слова "тик" и "так", из которых образуется повторяющийся ряд "тик-так", имитирующий ход часов/
using System;
using System.Threading;
class TickTock {
object lockOn = new object (); public void Tick(bool running) { lock(lockOn) {
if(!running) { // остановить часы ‘Monitor.Pulse(lockOn); // уведомить любые ожидающие потоки return;
}
Console.Write("тик ");
Monitor.Pulse(lockOn); // разрешить выполнение метода Tock() Monitor.Wait(lockOn); // ожидать завершения метода Tock()
}
}
public void Tock(bool running) { lock(lockOn) {
if(!running) { // остановить часы
Monitor.Pulse(lockOn); // уведомить любые ожидающие потоки return;
}
Console.WriteLine("так");
Monitor.Pulse(lockOn); // разрешить выполнение метода Tick() Monitor.Wait(lockOn); // ожидать завершения метода Tick()
}
}
}
class MyThread {
public Thread Thrd;
TickTock ttOb;
// Сконструировать новый поток.
public MyThread(string name, TickTock tt) {
Thrd = new Thread(this.Run); ttOb = tt;
Thrd.Name = name;
Thrd.Start(); '
}
// Начать выполнение нового потока, 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);
class TickingClock { static void Main() {
TickTock tt = new TickTock ();
MyThread mtl = new MyThread("Tick", tt);
MyThread mt2 = new MyThread("Tock", tt) ; mtl.Thrd.Join(); mt2.Thrd.Join();
Console.WriteLine("Часы остановлены");
}
}
Ниже приведен результат выполнения этой программы.
тик так тик так тик так тик так тик так
Часы остановлены
Рассмотрим эту программу более подробно. В методе Main () создается объект tt типа TickTock, который используется для запуска двух потоков на выполнение. Если в методе Run () из класса MyThread обнаруживается имя потока Tick, соответствующее ходу часов "тик", то вызывается метод Tick (). А если это имя потока Tock, соответствующее ходу часов "так", то вызывается метод Tock (). Каждый из этих методов вызывается пять раз подряд с передачей логического значения true в качестве аргумента. Часы идут до тех пор, пока этим методам передается логическое значение true, и останавливаются, как только передается логическое значение false.
Самая важная часть рассматриваемой здесь программы находится в методах Tick () и Tock (). Начнем с метода Tick (), код которого для удобства приводится ниже.