Untitled

mail@pastecode.io avatar
unknown
plain_text
a month ago
2.4 kB
2
Indexable
Never
using System;
using System.Threading;

class Program
{
    class TickTock
    {
        object lockOn = new object(); 

        public void Tick(bool running)
        {
            lock (lockOn)
            {
                if (!running)
                {
                    Monitor.Pulse(lockOn); // Сообщаем ожидающим потокам
                    return;
                }
                Console.WriteLine("Tick");
                Monitor.Pulse(lockOn); // Передаем управление другому потоку
                Monitor.Wait(lockOn);  // Ждем, пока другой поток не выполнит свою часть
            }
        }

        public void Tock(bool running)
        {
            lock (lockOn)
            {
                if (!running)
                {
                    Monitor.Pulse(lockOn); // Сообщаем ожидающим потокам
                    return;
                }
                Console.WriteLine("Tock");
                Monitor.Pulse(lockOn); // Передаем управление другому потоку
                Monitor.Wait(lockOn);  // Ждем, пока другой поток не выполнит свою часть
            }
        }
    }

    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); // Останавливаем "Tick"
            }
            else
            {
                for (int i = 0; i < 5; i++) ttOb.Tock(true);
                ttOb.Tock(false); // Останавливаем "Tock"
            }
        }
    }

    class TickingClock
    {
        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 has been stopped.");
        }
    }
}
Leave a Comment