Метод Join. Имена потоков, CurrentThread и ThreadState.
Иногда программный поток требуется приостановить до момента завершения другого потока. Допустим, вы хотите приостановить поток 1 до тех пор, пока поток 2 не завершит свои вычисления. Для этого из потока 1 вызывается метод Join для потока 2. Иначе говоря, команда:
thread2.Join()
Приостанавливает текущий поток и ожидает завершения потока 2. Поток 1 переходит в заблокированное состояние.
Если присоединить поток 1 к потоку 2 методом Join, операционная система автоматически запустит поток 1 после завершения потока 2. Учтите, что процесс запуска является недетерминированным: нельзя точно сказать, через какой промежуток времени после завершения потока 2 заработает поток 1. Существует и другая версия Join, которая возвращает логическую величину:
thread2.Join(Integer)
Этот метод либо ожидает завершения потока 2, либо разблокирует поток 1 после истечения заданного интервала времени, вследствие чего планировщик операционной системы снова будет выделять потоку процессорное время. Метод возвращает True, если поток 2 завершается до истечения заданного интервала тайм-аута, и False в противном случае.
Примечание
Не забывайте основное правило: независимо оттого, завершился ли поток 2 или про-изошел тайм-аут, вы не можете управлять моментом активизации потока 1.
Имена потоков, CurrentThread и ThreadState
Перед запуском каждому потоку рекомендуется присвоить содержательное имя, поскольку имена значительно упрощают отладку многопоточных программ. Для этого следует задать значение свойства Name командой следующего вида:
bThread.Name = "Subtracting thread"
Свойство Thread.CurrentThread возвращает ссылку на объект потока, выполняемого в настоящий момент.
Хотя для отладки многопоточных приложений в VB.NET существует замечательное окно потоков, о котором рассказано далее, нас очень часто выручала команда:
MsgBox(Thread.CurrentThread.Name)
Нередко выяснялось, что код выполняется совсем не в том потоке, в котором ему полагалось выполняться.
Напомним, что термин "недетерминированное планирование программных потоков" означает очень простую вещь: в распоряжении программиста практически нет средств, позволяющих влиять на работу планировщика. По этой причине в программах часто используется свойство ThreadState, возвращающее информацию о текущем состоянии потока.