Похожие презентации:
Хранение информации и многопоточность
1.
Хранение информации и многопоточность2.
МногопоточностьПоток – это некая независимая последовательность
инструкций для выполнения того или иного действия в
программе.
В одном конкретном потоке выполняется одна
конкретная последовательность действий.
Совокупность таких потоков, выполняемых в
программе параллельно называется
многопоточностью программы.
3.
МногопоточностьОдним из ключевых аспектов в современном
программировании является многопоточность. При
помощи многопоточности можно выделить в
приложении несколько потоков, которые будут
выполнять различные задачи одновременно.
Например, клиент-серверные приложения
практически не мыслимы без многопоточности.
4.
МногопоточностьСтандартно в проектах Visual Studio существует
только один основной поток – в методе Main. Всё, что в
нём выполняется – выполняется последовательно
строка за строкой.
Но при необходимости можно “распараллелить”
выполняемые процессы при помощи потоков.
5.
МногопоточностьЯзык C# имеет встроенную поддержку
многопоточности, а среда .NET Framework
предоставляет сразу несколько классов для работы с
потоками, что в купе очень помогает гибко и правильно
реализовывать и настраивать многопоточность в
проектах.
6.
МногопоточностьВ среде .NET Framework существует два типа потоков:
основной и фоновый (вспомогательный).
В целом отличие между ними одно – если первым
завершится основной поток, то фоновые потоки в его
процессе будут также принудительно остановлены,
если же первым завершится фоновый поток, то это не
повлияет на остановку основного потока – тот будет
продолжать функционировать до тех пор, пока не
выполнит всю работу и самостоятельно не
остановится.
Обычно при создании потока ему по умолчанию
присваивается основной тип.
7.
Класс ThreadОсновной функционал для использования потоков в
приложении сосредоточен в пространстве имен
System.Threading.
В нем определен класс, представляющий
отдельный поток - класс Thread.
8.
Свойства класса ThreadКласс Thread определяет ряд методов и свойств,
которые позволяют управлять потоком и получать
информацию о нем.
Основные свойства класса:
• CurrentContext позволяет получить контекст, в
котором выполняется поток
• CurrentThread возвращает ссылку на выполняемый
поток
• IsAlive указывает, работает ли поток в текущий
момент
9.
Свойства класса Thread• IsBackground указывает, является ли поток
фоновым
• Name содержит имя потока
• Priority хранит приоритет потока - значение
перечисления ThreadPriority
• ThreadState возвращает состояние потока - одно из
значений перечисления ThreadState
10.
Методы класса Thread• GetDomain возвращает ссылку домен приложения
• GetDomainId возвращает id домена приложения, в
котором выполняется текущий поток
• Sleep останавливает поток на определенное
количество миллисекунд
• Abort уведомляет среду CLR о том, что надо
прекратить поток, однако прекращение работы
потока происходит не сразу, а только тогда, когда это
становится возможно. Для проверки завершенности
потока следует опрашивать его свойство ThreadState
11.
Методы класса Thread• Interrupt прерывает поток на некоторое время
• Join блокирует выполнение вызвавшего его потока
до тех пор, пока не завершится поток, для которого
был вызван данный метод
• Resume возобновляет работу ранее
приостановленного потока
• Start запускает поток
• Suspend приостанавливает поток
12.
Пример• Результат:
13.
Статус потокаСтатусы потока содержатся в перечислении
ThreadState:
• Aborted: поток остановлен, но пока еще
окончательно не завершен
• AbortRequested: для потока вызван метод Abort, но
остановка потока еще не произошла
• Background: поток выполняется в фоновом режиме
• Running: поток запущен и работает (не
приостановлен)
• Stopped: поток завершен
• StopRequested: поток получил запрос на остановку
• Suspended: поток приостановлен
14.
Статус потока• SuspendRequested: поток получил запрос на
приостановку
• Unstarted: поток еще не был запущен
• WaitSleepJoin: поток заблокирован в результате
действия методов Sleep или Join
В процессе работы потока его статус многократно
может измениться под действием методов.
Так, в самом начале до применения метода Start его
статус имеет значение Unstarted. Запустив поток, статус
меняется на Running. Вызвав метод Sleep, статус
изменится на WaitSleepJoin. Применяя метод Abort,
поток переводится в состояние AbortRequested, а затем
Aborted, после чего поток окончательно завершится.
15.
Запуск потокаПотоки в C# начинают выполняться не сразу после
их инициализации. Каждый из созданных потоков
необходимо сначала запустить.
Делается это следующим образом:
имя_потока.Start();.
Пример: mythread.Start();
Данный фрагмент записывается в главной функции
Main.
16.
Запуск потокаТеперь, при запуске программы, как только в Main
выполнится метод Start(), начнёт работать вновь
созданный поток.
После того, как выполнился Start(), работа
программы “распараллеливается”: один поток начинает
выполнять код из метода для которого был создан
поток, а второй поток продолжает выполнять операции,
которые остались ещё не
выполненными в методе Main (после Start()).
17.
Приостанавливание потокаБывают сценарии, когда необходимо приостановить
поток, например для того, чтобы пропустить другие
потоки и не мешать им выполнять свою работу, либо
для снижения потребления процессорного времени.
Одним из способов приостановления потоков
является следующий:
Thread.Sleep(100); - поток, к которому будет
относиться данная инструкция, будет приостановлен
на 100 миллисекунд.
18.
Приоритеты потокаПриоритеты потока располагаются в перечислении
ThreadPriority:
•Highest - самый высокий
•AboveNormal - выше среднего
•Normal - стандартный
•BelowNormal - ниже среднего
•Lowest - самый низкий
По умолчанию потоку задается значение Normal.
Можно изменить приоритет в процессе работы
программы. Например, повысить важность потока,
установив приоритет Highest.
19.
Приоритеты потокаЧем выше приоритет, тем быстрее он выполнится,
опережая потоки с меньшим значением. Если у потоков
одинаковые приоритеты, они выполняются по очереди.
Приоритеты потоков можно и менять, делается это
так:
имяпотока.Priority =
ThreadPriority.вариантприоритета;
НО! Приоритет метода Main изменить нельзя. Он
всегда будет в позиции Normal.
20.
Изменение типов потокаПотоки в C# бывают основными и фоновыми.
При создании потока он по умолчанию становится
основным. Однако его тип можно, также как и приоритет,
поменять. Для того, чтобы сделать основной поток
фоновым, нужно изменить его свойство IsBackground:
имя_потока.IsBackground = true;
Пример: ythread.IsBackground = true;
Если установить данное свойство в значение true, то
поток будет работать как фоновый, если в значение
false - как основной.
21.
Изменение типов потокаЕсли в программе используется несколько потоков,
то не всегда можно понять, какой поток к какому типу
относится. Но всегда можно легко это узнать:
bool a = mythread.IsBackground;
Console.WriteLine(a);
22.
Задание 1Реализовать работу нескольких параллельных
потоков.
23.
24.
Задание 2Написать программу с тремя потоками, каждый из
которых будет выводить в консоль цифры от 0 до 9, от
10 до 19 и от 20 до 29 соответственно. Вывести в
консоль все эти числа последовательно от 0 до 29.
Программирование