- •Оглавление
- •Класс Thread. Общая информация.
- •Thread – составляющие
- •Свойства
- •1) В следующем примере кода показаны простейшие функциональные возможности работы с потоками.
- •2)Пример изменения и использования свойств Priotiry, Name, CurrentThread
- •3) Создание потоков в фоновом режиме. Использование свойства IsBackground.
- •4) Ключевое слово lock
- •Interrupt(), Sleep(), SpinWait(), Join()
- •Класс Process Общая информация.
- •Process – составляющие Свойства
- •Примеры:
- •Класс WaitHandle Общая информация.
- •WaitHandle – составляющие Поля
- •Свойства
- •Класс Mutex Общая информация.
- •Mutex – составляющие Свойства
- •Примеры
- •Класс AutoResetEvent Общая информация.
- •AutoResetEvent – составляющие Методы
- •Примеры
- •Класс ManualResetEvent Общая информация.
- •ManualResetEvent – составляющие Методы
- •Примеры
- •Класс Monitor Общая информация.
- •Monitor – составляющие Методы
- •Класс Semaphore
- •Список литературы
Thread – составляющие
Примечание: в данном разделе рассмотрены наиболее важные члены класса Thread. (Более полную информацию можно найти в [3, 4, 6])
Свойства
|
Имя |
Описание |
|
CurrentThread |
Возвращает поток, выполняющий в данный момент текущий участок кода. |
|
IsAlive |
Возвращает true, если поток стартовал и еще не завершил свою работу. Иначе возвращает false. |
|
IsBackground |
Возвращает или задает значение, показывающее, является ли поток фоновым (подробности в примере №3 данного раздела). |
|
Name |
Возвращает или задает имя потока. |
|
Priority |
Возвращает или задает значение, указывающее на планируемый приоритет потока. |
|
ThreadState |
Возвращает значение, содержащее состояния текущего потока. |
|
|
|
Определение:
[C#]
public static Thread CurrentThread {get;}
public bool IsAlive {get;}
public bool IsBackground {get; set;}
public string Name {get; set;}
public ThreadPriority Priority {get; set;}
public ThreadState ThreadState {get;}
Примеры:
1) В следующем примере кода показаны простейшие функциональные возможности работы с потоками.
using System;
using System.Threading;
//Запустим статический метод во втором потоке
public class ThreadExample
{
//Метод вызываеться когда поток стартует.
//Проходит десять итераций,пишет на консоль
//и выходит
public static void ThreadProc()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("ThreadProc: {0}", i);
Thread.Sleep(0);
}
}
public static void Main()
{
Console.WriteLine("Main thread: Start a second thread.");
//Создаем новый поток. В качестве входного параметра
//передаем конструктору делегат на функцию
Thread t = new Thread(new ThreadStart(ThreadProc));
//Запускаем поток
t.Start();
//Thread.Sleep(0);
//Четыре итерации вывода на консоль
for (int i = 0; i < 4; i++)
{
Console.WriteLine("Main thread: Do some work.");
Thread.Sleep(0);
}
Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.");
//Вызоваем join для того чтоподождать окончания работы ThreadProc
t.Join();
Console.WriteLine("Main thread: ThreadProc.Join has returned. Press Enter to end program.");
Console.ReadLine();
}
}
Выходная информация:
Этот код формирует выходные данные, подобные приведенным ниже:
Main thread: Start a second thread.
Main thread: Do some work.
ThreadProc: 0
Main thread: Do some work.
ThreadProc: 1
Main thread: Do some work.
ThreadProc: 2
Main thread: Do some work.
ThreadProc: 3
Main thread: Call Join(), to wait until ThreadProc ends.
ThreadProc: 4
ThreadProc: 5
ThreadProc: 6
ThreadProc: 7
ThreadProc: 8
ThreadProc: 9
Main thread: ThreadProc.Join has returned. Press Enter to end program.
2)Пример изменения и использования свойств Priotiry, Name, CurrentThread
using System;
using System.Threading;
class Test
{
static void Main()
{
PriorityTest priorityTest = new PriorityTest();
ThreadStart startDelegate =
new ThreadStart(priorityTest.ThreadMethod);
//Создаем потоки
Thread threadOne = new Thread(startDelegate);
threadOne.Name = "ThreadOne";
Thread threadTwo = new Thread(startDelegate);
threadTwo.Name = "ThreadTwo";
//Выставляем приоритет
threadTwo.Priority = ThreadPriority.BelowNormal;
//Запускаем потоки
threadOne.Start();
threadTwo.Start();
// Позвляем считать в течение 10 секунд
Thread.Sleep(10000);
priorityTest.LoopSwitch = false;
}
}
class PriorityTest
{
bool loopSwitch;
public PriorityTest()
{
loopSwitch = true;
}
public bool LoopSwitch
{
set { loopSwitch = value; }
}
public void ThreadMethod()
{
long threadCount = 0;
while (loopSwitch)
{
threadCount++;
}
//Вывод в консоль
Console.WriteLine("{0} with {1,11} priority " +
"has a count = {2,13}", Thread.CurrentThread.Name,
Thread.CurrentThread.Priority.ToString(),
threadCount.ToString("N0"));
}
}
Выходная информация:
ThreadTwo with BelowNormal priority has a count = 1 223 260 335
ThreadOne with Normal priority has a count = 1 293 215 035