Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Запуск потока






Создания объекта, задающего поток, еще не достаточно, чтобы поток начал выполняться. Для запуска потока на выполнение необходимо вызвать метод Start в форме my_thread.Start(), либо в форме my_thread.Start(my_object), если методу my_method необходимо передать информацию. Заметьте, фактический аргумент my_object, передаваемый методу, исполняемому потоком, передается не в момент создания потока, а в момент его запуска на выполнение. Другая ситуация имеет место, когда потоку передается анонимный метод. Как показано в предыдущем примере, анонимный метод вызывает метод Info, передавая ему фактические параметры.

Следует понимать, что вызов метода Start не означает, что запущенный метод my_method непосредственно начнет выполняться. Вызов метода Start является указанием операционной системе на перевод потока my_thread из состояния " создание" в состояние " готовность", так что поток станет в очередь на выполнение.

Когда запущенный на выполнение метод my_method завершает свою работу, то заканчивает свою жизнь и соответствующий поток, для него нельзя повторно вызвать метод Start. для повторного запуска метода нужно создать новый поток.

Состояние " ожидание"

Выполняемый поток операционная система периодически может переводить в состояние " ожидание", предоставляя процессор другим потокам. Но поток сам может потребовать перевода его в это состояние. Причины для этого могут быть разные, - чаще всего это делается в интересах синхронизации совместной работы потоков. Рассмотрим два метода класса Thread, используемые для этих целей. Статический метод Sleep позволяет потоку " уснуть" на некоторое время. У этого метода две перегруженные реализации, - обе с одним аргументом - dt. Если задать аргумент dt типа int, то поток засыпает на dt миллисекунд, после чего готов выполнять свою работу. Часто задается значение этого аргумента, равное нулю. В этом случае поток добровольно позволяет другим потокам выполнять свою работу, а сам становится в конец очереди. Аргумент dt может быть объектом класса TimeSpan. У этого класса несколько конструкторов. Если вызвать конструктор с одним аргументом, то время сна будет задаваться в тиках, если задавать три аргумента, то можно время можно задать в часах, минутах, секундах; четыре аргумента позволяют задавать и миллисекунды.

Возможным значением аргумента dt является и константа класса Timeout - Infinity, когда поток засыпает на неопределенно долгое время.

Другим методом, прерывающим работу потока, является метод Join. Представьте, что основной поток создал поток my_thread, запустил его на выполнение, и сам продолжает выполняться. В какой-то момент времени основному потоку могут понадобиться результаты работы запущенного им потока my_thread, но ему неизвестно, закончил ли свою работу дочерний поток. В этом случае в основном потоке осуществляется вызов my_thread.Join. Вызывающий поток приостанавливается, пока не произойдет событие - дочерний поток завершил работу. Остановки не будет, если в момент выполнения Join дочерний поток уже завершил свою работу.

Поток может вызывать метод Join не как процедуру, а как булевскую функцию с одним аргументом dt, задающим время, в течение которого вызывающий поток ждет завершения работы дочернего потока. Если в указанное время дочерний поток завершается, то функция возвращает значение true, иначе - false.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.