Многопоточное программирование в Java. Тимур Машнин
Чтение книги онлайн.

Читать онлайн книгу Многопоточное программирование в Java - Тимур Машнин страница 3

СКАЧАТЬ эту проблему мы можем с помощью метода join ().

      Этот код запустит второй поток t2, только после завершения первого потока t1, так как метод join приостанавливает выполнение главного потока до тех пор, пока не завершится поток t1.

      Если поток прерывается, бросается исключение InterruptedException.

      Теперь, предположим, что мы передали в метод run класса MyClass основной поток и применили к нему метод join.

      Тогда первый поток будет ждать, когда завершится основной поток, а основной поток будет ждать, когда завершится первый поток.

      Возникнет дедлок deadlock или взаимная блокировка потоков.

      Для отладки долгоиграющих операций, например, сетевых запросов, часто используется статический метод sleep класса Thread.

      Вызов этого метода ставит выполнение текущего потока на паузу, при этом нужно указать количество миллисекунд паузы.

      Здесь также нужно обрабатывать исключение InterruptedException.

      Это исключение, которое метод бросает, когда другой поток прерывает текущий поток, при работающем методе.

      Теперь, вы можете столкнуться с ситуацией, когда вам нужно выполнить некоторые длительные задачи в отдельных потоках.

      И возможно, вам нужно будет завершить работу какой-либо задачи еще до того, как задача будет полностью выполнена, с помощью остановки соответствующего потока.

      Например, при закрытии приложения, которое может использовать несколько потоков, и они могут быть не завершены в момент закрытия приложения.

      Как запросить задачу, выполняемую в отдельном потоке, закончиться раньше?

      Как заставить задачу реагировать на такой запрос?

      В этом примере создается задача, которая печатает числа от 0 до 9 в консоли.

      После печати числа, задача должна подождать 1 секунду перед печатью следующего числа.

      Задача выполняется в отдельном потоке, отличном от основного потока приложения.

      После запуска задачи основной поток должен подождать 3 секунды и затем завершить работу.

      При завершении работы приложение должно запросить завершение выполняемой задачи.

      Перед тем, как полностью закрыть приложение, приложение должно максимально ждать 1 сек для завершения задачи.

      Задача должна ответить на запрос завершения, немедленно останавливаясь.

      Общее выполнение задачи занимает не менее 9 секунд.

      Поэтому задача не сможет распечатать все десять чисел от 0 до 9.

      Для запроса на прерывание потока, основной поток вызывает метод прерывания interrupt.

      В Java один поток не может просто остановить другой поток.

      Поток может только запросить остановку другого потока.

      И запрос выполняется в виде вызова метода interrupt.

      Вызов метода interrupt в экземпляре Thread устанавливает флаг прерывания как true.

      Если этот поток заблокирован вызовом методов wait, СКАЧАТЬ