Page 240 - 6571
P. 240

new MyThread(mainthrd), "Thread #2");
                        thrd1.start();
                        thrd2.start();
                        try {

                            thrd1.join();
                            thrd2.join();
                            //  TODO:  Код,  який  має  бути  виконаний  в  головному
                  потоці
                            System.out.println(mainthrd.getName() +
                                    " thread is alive " + mainthrd.isAlive());
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                        }

                        Якщо в програмі є потік, який захоплює процесор, проводячи
                  велику кількість обчислень, то може з’явитися необхідність при-

                  мушувати його час від часу «звільняти» процесор, даючи можли-
                  вість виконуватися іншим потокам. Це досягається за допомогою
                  статичного  методу  yield(),  який  викликається  із  потоку,  що

                  має  вивільнити  квант  процесорного  часу  на  виконання  іншого
                  потоку. Виклик методу yield() гарантує, що потік покине «мо-
                  нітор» (монітор у мові Java – це об’єкт, який використовується,

                  як взаємовиключне блокування. Тільки один потік може в один і
                  той же самий час володіти монітором), але не гарантує, що інший
                  потік ним заволодіє.
                        Для  прийняття  рішення  про  те,  коли  кожен  із  потоків  має

                  працювати, планувальником потоків використовуються пріорите-
                  ти потоків. Теоретично високопріоритетні потоки отримують бі-

                  льше процесорного часу, ніж низькопріоритетні. Практично обсяг
                  процесорного часу, який отримує потік, часто залежить і від ін-
                  ших  факторів,  окрім  його  пріоритету  (наприклад,  від  того,  як
                  операційна система реалізує багатозадачність може залежати від-

                  носна доступність процесорного часу) Високопріоритетний потік
                  має змогу також переривати роботу низькопріоритетного. Напри-
                  клад, коли низькопріоритетний потік виконується, а високопріо-

                  ритетний  збирається  продовжити  своє  перерване  виконання  (у
                  зв’язку  із  призупиненням  або  очікуванням  завершення  операції
                  введення-виведення), то він вивантажує низькопріоритетний по-
                  тік.





                                                             239
   235   236   237   238   239   240   241   242   243   244   245