Page 249 - 6253
P. 249
System.out.println(ob1.thread.getName() +
"потік запущений:" + ob1.thread.isAlive());
System.out.println(ob2.thread.getName() +
"потік запущений:" + ob2.thread.isAlive());
System.out.println(ob3.thread.getName() +
"потік запущений:" + ob3.thread.isAlive());
try {
System.out.println("Очікування завершення потоків");
ob1.thread.join();
ob2.thread.join();
ob3.thread.join();
} catch (InterruptedException e) {
System.out.println("Головний потік перерваний");
System.out.println(ob1.thread.getName() +
"потік запущений:" + ob1.thread.isAlive());
System.out.println(ob2.thread.getName() +
"потік запущений:" + ob2.thread.isAlive());
System.out.println(ob3.thread.getName() +
"потік запущений:" + ob3.thread.isAlive());
System.out.println("Головний потік завершений");
}
}
}
Як видно із представленого прикладу, потоки припиняють роботу після того, як
виклики методу join() повернуть керування головному потоку.
10.4.2 Керування пріоритетами потоків та їх синхронізація
Планувальник потоків використовує пріоритети потоків для прийняття рішення
про те, коли кожен із потоків має працювати. Теоретично високопріоритетні потоки
отримують більше процесорного часу, ніж низькопріоритетні. Практично обсяг
процесорного часу, який отримує потік, часто залежить і від інших факторів, окрім
його пріоритету (наприклад, від того, як операційна система реалізує
багатозадачність, може залежати відносна доступність процесорного часу)
Високопріоритетний потік має змогу також переривати роботу
низькопріоритетного. Наприклад, коли низькопріоритетний потік виконується, а
високопріоритетний збирається продовжити своє перерване виконання (у зв’язку із
248