Page 239 - 6571
P. 239

Але якщо потік заблокований, то перевірити стан його пере-
            ривання не можливо, проте можна використати згенерований ви-
            няток типу InterruptedException. Метод run() такого по-

            току може мати наступний вигляд:
                  public void run() {

                      try {
                        while (!Thread.currentThread().isInterrupted()) {
                           // TODO: Код, який має бути виконаний в потоці
                              Thread.sleep(5000);
                          }
                      } catch (InterruptedException e) {
                          // TODO: Код, який має бути виконаний у випадку
            якщо
                          // потік перерваний через виклик методу sleep()
                          Thread.currentThread().interrupt();
                      }
                  }

                  У  мові  Java  не  існує  вимоги,  що  перерваний  потік  повинен
            припинити  виконання.  Перерваний  потік  може  сам  вирішувати,

            як реагувати на переривання. Деякі потоки є настільки важливи-
            ми, що повинні виконати обробку виняткової ситуації і продов-
            жити своє виконання. Але найчастіше потік повинен інтерпрету-

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

            По-перше, для будь-якого потоку можна викликати метод isA
            ive(), визначений у класі Thread. Метод isAlive() повер-
            тає значення true, якщо потік, для якого він був викликаний, ще

            виконується. В іншому випадку він поверне значення false.
                  По-друге,  в  класі  Thread  визначено  метод  join(),  який

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

            ня зазначеного потоку.


                  Thread mainthrd = Thread.currentThread();
                  Thread thrd1 = new Thread(
                          new MyThread(mainthrd), "Thread #1");
                  Thread thrd2 = new Thread(

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