Однопоточное выполнение (англ.Single Threaded Execution или англ.Critical Section) — параллельныйшаблон проектирования, препятствующий конкурентному вызову метода, тем самым запрещая параллельное выполнение этого метода.
usingSystem;usingSystem.Threading;namespaceDigital_Patterns.Concurrency.Single_Thread_Execution{/// <summary>/// Экземпляры класса <see cref="TrafficSensor"/> связаны с сенсором движения/// транспорта, который фиксирует прохождение машиной некоторого места на/// полосе движения./// </summary>classTrafficSensor{privatestaticInt32mID=0;privateITrafficObserver_observer;publicBooleanIsRun{get;set;}privateInt32_id;/// <summary>/// Конструктор/// </summary>/// <param name="observer">Объект, предназначенный для оповещения о том, что сенсор/// движения транспорта, связанный с этим объектом,/// обнаруживает проходящую машину.</param>publicTrafficSensor(ITrafficObserverobserver){_id=++mID;_observer=observer;IsRun=true;newThread(Run).Start();}/// <summary>/// Общая логика для потока этого объекта/// </summary>privatevoidRun(){while(IsRun){motitorSensor();}}privatestaticRandommRnd=newRandom();/// <summary>/// Этом метод вызывает метод detect объекта, когда/// связанный с ним сенсор движения транспорта фиксирует /// проходящую машину/// </summary>privatevoidmotitorSensor(){//TODO SomethingThread.Sleep(mRnd.Next(1000));varmsg=System.Reflection.MethodInfo.GetCurrentMethod().Name;Console.WriteLine(String.Format(@"{0} {1} +1",_id,msg));detect();}/// <summary>/// Этот метод вызывается методом <see cref="motitorSensor"/>, /// чтобы сообщить о прохождении транспортного средства /// наблюдателю этого объекта/// </summary>privatevoiddetect(){_observer.vehiclePassed();}/// <summary>/// Классы должны реализовывать этот интерфейс, /// чтобы объект <see cref="TrafficSensor"/> мог сообщить им о прохождении /// машин/// </summary>publicinterfaceITrafficObserver{/// <summary>/// Вызывается тогда, когда <see cref="TrafficSensor"/> фиксирует /// проходящее транспортное средство./// </summary>voidvehiclePassed();}}}
usingSystem;namespaceDigital_Patterns.Concurrency.Single_Thread_Execution{/// <summary>/// Экземпляры класса <see cref="TrafficSensorController"/> хранят текущее/// общее количество машин, прошедших мимо сенсоров движения транспорта,/// связанных с экземпляром./// </summary>classTrafficSensorController:TrafficSensor.ITrafficObserver{privateInt32_vehicleCount=0;/// <summary>/// Этот метод вызывается в том случае, когда сенсор движения/// транспорта фиксирует прохождение машины. Он увеличивает /// значение счетчика машин на единицу./// </summary>publicvoidvehiclePassed(){lock(this){++_vehicleCount;}}/// <summary>/// Сбрасывает счетчик машин в нуль/// </summary>/// <returns></returns>publicInt32GetAndClearCount(){lock(this){Int32count=_vehicleCount;_vehicleCount=0;returncount;}}}}
usingSystem;usingSystem.Threading;namespaceDigital_Patterns.Concurrency.Single_Thread_Execution{/// <summary>/// Экземпляры класса <see cref="TrafficTransmitter"/> отвечают за передачу/// занчения, определяющего количество машин, проходящих через данное место/// дороги за одну минуту./// </summary>classTrafficTransmitter{privateTrafficSensorController_conrtoller;privateThread_myThread;publicBooleanIsRun{get;set;}/// <summary>/// Конструктор/// </summary>/// <param name="conrtoller">От <see cref="TrafficSensorController"/> этот объект/// будет получать значение счетчика количества прошедших /// машин</param>publicTrafficTransmitter(TrafficSensorControllerconrtoller){_conrtoller=conrtoller;_myThread=newThread(Run);IsRun=true;_myThread.Start();}/// <summary>/// Передает значение счетчика количества машин, прошедщих /// за промежуток времени/// </summary>privatevoidRun(){while(IsRun){Thread.Sleep(10000);Transmit(_conrtoller.GetAndClearCount());}}privatevoidTransmit(Int32count){//TODO Somethingvarmsg=System.Reflection.MethodInfo.GetCurrentMethod().Name;Console.WriteLine(String.Format(@"{0} {1}",msg,count));}}}
usingSystem;usingDigital_Patterns.Concurrency.Single_Thread_Execution;namespaceDigital_Patterns{classProgram{staticvoidMain(string[]args){varcontroller=newTrafficSensorController();vartransmitter=newTrafficTransmitter(controller);Console.WriteLine(@"Press any key for start, and press again for finish");Console.ReadKey();varsensor1=newTrafficSensor(controller);varsensor2=newTrafficSensor(controller);Console.ReadKey();sensor1.IsRun=false;sensor2.IsRun=false;transmitter.IsRun=false;Console.WriteLine();}}}
Mark Grand. Patterns in Java Volume 1: A Catalog of Reusable Design Patterns Illustrated with UML. — Wiley & Sons, 1998. — 480 с. — ISBN 0471258393. (см. синопсис (англ.))