Page 247 - 6253
P. 247

переривання типу InterruptedException ігнорується:

                  void myMethod() {
                     try {
                        sleep(delay);

                     } catch(InterruptedException e) { } // не ігнорувати!
                  }
                  Якщо  нічого  цікавого  в  блоці  catch  зробити  не  вдається,  то  на  вибір


            залишається наступних два обґрунтованих варіанта:

                  1. Зробити  в  блоці  catch  виклик  методу  Thread.currentThread().Interrupt(),  щоб

            встановити  стан  переривання  потоку  і  тоді  цей  стан  може  бути  перевірений  у

            викликаючій частині програми:

                  void myMethod() {
                     try {
                        sleep(delay);

                     } catch (InterruptedException e) {
                        Thread.currentThread().Interrupt();

                     }
                  }
                  2. Прописати  throws InterruptedException  в  сигнатурі  методу  та  видалити  блок

            try / catch,  і  тоді  дане  переривання  може  бути  перехоплене  у  викликаючій  частині

            програми (або в крайньому випадку в методі run()):

                  void myMethod() throws InterruptedException {

                     sleep(delay);
                  }


                    10.4. Керування життєвим циклом та синхронізація


                    10.4.1  Використання методів isalive() та join()

                  Як уже було згадано, найчастіше необхідно, щоб головний потік завершувався

            останнім.  У  попередніх  прикладах  з  методу  main()  виконувався  виклик  методу

            sleep()із  затримкою,  достатньою  для  того  щоб  гарантувати,  що  всі  дочірні  потоки

            завершаться раніше головного. Однак дане рішення породжує наступне питання: як

            один  потік  може  знати  про  завершення  іншого  потоку?  Для  цього  в  класі  Thread

            визначені відповідні методи, що дають відповідь на це питання.

                  Існує  два  способи  визначити,  що  потік  був  завершений.  По-перше,  для  будь-

            якого  потоку  можна  викликати  метод  isAlive(),  визначений  у  класі  Thread.  Метод


                                                              246
   242   243   244   245   246   247   248   249   250   251   252