Часть II. Объектно-ориентированное программирование
А вторичный поток в одном месте программы запустился, выдал одно
число. И что дальше? Нигде не видно, что он станет читать и выдавать
на экран второе число, третье число и т. д. Но он все-таки выдает, и это
подтверждает рис. 17.5. А все дело в том, что (и это мы рассматривали,
когда изучали Windows-процессы) среда исполнения не бросает потоки
до тех пор, пока не завершится главный поток, связанный с методом
Main()
. Она, среда, постоянно поочередно или в соответствии с приори-
тетом потока передает управление каждому потоку приложения. Вот и в
случае нашего приложения вторичный поток так и будет исполняться,
т. е. будет печатать значение переменной
number
, которую постоянно
обновляет в цикле главный поток. Когда приложение закончится, за-
кончатся и потоки. Но все-таки один вопрос остается невыясненным до
конца: а что будет и что делать (хотя здесь более-менее ясно), если при-
ложение закончилось, а один или несколько потоков еще должны рабо-
тать? Ясно, что надо каким-то образом приостановить приложение до
завершения всех потоков. В этой связи все потоки разделены на потоки
так называемого переднего плана (ППП) и фоновые потоки (ФП). ППП
предохраняют приложение от завершения. Среда исполнения не остано-
вит приложение, пока не будут завершены все так называемые фоновые
потоки. ФП рассматриваются средой исполнения как некие вспомога-
тельные, которые в любой момент времени могут игнорироваться, даже
если они еще не завершили положенную им работу. Как только все
ППП завершены, автоматически прекращаются и уничтожаются и
все ФП. Однако ППП и ФП не являются синонимами первичных и
вторичных (рабочих) потоков. Каждый поток, запускаемый методом
ThreadStart()
, по умолчанию считается потоком переднего плана. Для
таких потоков, повторим, приложение никогда не выгрузится испол-
няемой средой, т. е. не завершится, пока каждый из таких потоков не
выполнит свою часть работы. А если каким-то образом некоторый по-
ток превратить в фоновый, надо понимать, что такой поток может и не
доработать до конца, потому что все не фоновые, т. е. потоки ППП, за-
вершатся, а такой поток после этого прервется и уничтожится. Таким
образом, программист сам должен решить, превращать ли ППП в ФП и
чем это грозит решаемой задаче.
Превратить некоторый ППП в ФП довольно просто. Достаточно в том
месте, где запускается ППП, добавить команду установки свойства
класса
Thread
, которое называется
IsBackground
(
Background
как раз и
означает "фоновый", а
Foreground
— переднего плана), в значение
true
.
Вот пример из листинга 17.3:
Thread sec = new Thread(new ThreadStart(p.PrintNumbers));
Do'stlaringiz bilan baham: |