Page 139 - 4868
P. 139

137                                                              Ошибка! Стиль не определен.

                         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() повернуть керування головному потоку.


                     19.2. Керування пріоритетами потоків та їх синхронізація
                     Планувальник  потоків  використовує  пріоритети  потоків  для  прийняття
               рішення  про  те,  коли  кожен  із  потоків  має  працювати.  Теоретично
               високопріоритетні  потоки  отримують  більше  процесорного  часу,  ніж
               низькопріоритетні. Практично обсяг процесорного часу, який отримує потік,
               часто залежить і від інших факторів, окрім його пріоритету (наприклад, від
               того,  як  операційна  система  реалізує  багатозадачність,  може  залежати
               відносна  доступність  процесорного  часу)  Високопріоритетний  потік  має
               змогу  також  переривати  роботу  низькопріоритетного.  Наприклад,  коли
               низькопріоритетний  потік  виконується,  а  високопріоритетний  збирається
               продовжити  своє  перерване  виконання  (у  зв’язку  із  призупиненням  або
               очікуванням  завершення  операції  введення-виведення),  то  він  вивантажує
               низькопріоритетний потік.
                     Теоретично  потоки  з  одинаковим  пріоритетом  повинні  отримувати
               одинаковий  доступ  до  центрального  процесора.  Але  оскільки  мова  Java
               спроектована  для  роботи  в  широкому  спектрі  середовищ,  то  деякі  з  низ
               мають  свій  принцип  реалізації  багатозадачності.  Наприклад,  в  операційній
               системі Windows передбачено сім рівнів пріоритетів. А у віртуальній машині
               Oracle для Linux пріоритети потоків взагалі ігноруються.
                     З метою безпеки, потоки з однаковим пріоритетом повинні отримувати
               одинаковий доступ до центрального процесора. Це гарантує, що всі потоки
   134   135   136   137   138   139   140   141   142   143   144