Page 133 - 4868
P. 133

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

                       public static void main(String[] args) {
                         Thread thread = new Thread(new MyThread(),
                                                         "Демонстраційний потік");
                         System.out.println("Дочірній потік створено:" + thread);
                         // запуск потоку
                         thread.start();
                         try {
                           for (int i = 5; i > 0; i--) {
                             System.out.println("Головний потік: " + i);
                             Thread.sleep(1000);
                           }
                         } catch (InterruptedException e) {
                           System.out.println("Головний потік перерваний");
                           System.out.println("Головний потік завершений");
                         }
                       }
                     }
                     В  результаті  виклику  методу  start(),  відбувається  запуск  потоку.
               Метод  run()  запускає  цикл  for  дочірнього  потоку.  Після  виклику  методу
               start() конструктор MyThread() повертає керування методу main(). Коли

               головний  потік  продовжує  свою  роботу,  він  входить  у  власний  цикл  for.
               Після      цього      обидва      потоки       виконуються        паралельно,        спільно
               використовуючи ресурси процесора, аж до завершення своїх циклів.
                     Як уже згадувалося раніше, в багатопотоковій програмі головний потік
               часто  повинен  завершувати  виконання  останнім.  У  деяких  старих
               віртуальних  машинах  Java  (JVM),  якщо  головний  потік  завершується  до
               завершення дочірніх потоків, то у програмі може відбутися збій. Попередня
               програма  гарантує,  що  головний  потік  завершиться  останнім,  оскільки
               головний  потік  «спить»  1000  мілісекунд  між  ітераціями  циклу,  а  дочірній
               потік  –  тільки  500  мілісекунд.  Це  змушує  дочірній  потік  завершитися
               швидше за головний.
                     Розширення  класу  Thread.  Ще  один  спосіб  створення  потоку  –  це
               оголосити  клас,  який  розширює  клас  Thread,  а  потім  створити  екземпляр
               даного класу. Дочірній клас зобов’язаний перевизначити метод run(), який є
               точкою  входу  для  нового  потоку.  Він  також  повинен  викликати  метод
               start()  для  запуску  виконання  нового  потоку.  У  лістингу  2.5  наведено
               приклад  попередньої  програми,  переписаної  з  використанням  розширення
               класу Thread.

                     Лістинг 2.5 – Створення потоку шляхом розширення класу Thread

                     class MyThread extends Thread {
                       // точка входу власного потоку
                       public void run() {
                         try {
                           for (int i = 5; i > 0; i--) {
   128   129   130   131   132   133   134   135   136   137   138