Page 168 - 6571
P. 168

System.out.println("Головний потік перерваний");
                              System.out.println("Головний потік завершений");
                            }
                          }

                        }
                        Як  уже  згадувалося  раніше,  в  багатопотоковій  програмі

                  головний потік часто повинен завершувати виконання останнім.
                  У  деяких  старих  віртуальних  машинах  Java  (JVM),  якщо
                  головний потік завершується до завершення дочірніх потоків, то

                  у  програмі  може  відбутися  збій.  Попередня  програма  гарантує,
                  що  головний  потік  завершиться  останнім,  оскільки  головний
                  потік «спить» 1000 мілісекунд між ітераціями циклу, а дочірній

                  потік  –  тільки  500  мілісекунд.  Це  змушує  дочірній  потік
                  завершитися швидше за головний.
                        Розширення класу Thread. Ще один спосіб створення потоку

                  –  це  оголосити  клас,  який  розширює  клас  Thread,  а  потім
                  створити  екземпляр  даного  класу.  Дочірній  клас  зобов’язаний
                  перевизначити  метод  run(),  який  є  точкою  входу  для  нового

                  потоку.  Він  також  повинен  викликати  метод  start()  для
                  запуску  виконання  нового  потоку.  У  лістингу  35  наведено
                  приклад  попередньої  програми,  переписаної  з  використанням

                  розширення класу Thread.

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

                        class MyThread extends Thread {
                          // точка входу власного потоку

                          public void run() {
                            try {
                              for (int i = 5; i > 0; i--) {
                                System.out.println("Дочірній потік:" + i);
                                Thread.sleep(500);
                              }

                            } catch (InterruptedException e) {
                            System.out.println("Дочірній потік перерваний");
                            }
                            System.out.println("Дочірній потік завершений");

                          }
                        }

                                                             167
   163   164   165   166   167   168   169   170   171   172   173