Java руководство для начинающих - Шилдт Герберт (2012)
-
Год:2012
-
Название:Java руководство для начинающих
-
Автор:
-
Жанр:
-
Оригинал:Английский
-
Язык:Русский
-
Издательство:Вильямс
-
Страниц:316
-
ISBN:978-5-8459-1770-6
-
Рейтинг:
-
Ваша оценка:
Java руководство для начинающих - Шилдт Герберт читать онлайн бесплатно полную версию книги
В теле метода run () присутствует цикл, в котором производится отсчет от 0 до 9. Обратите внимание на вызов метода sleep (). Этот метод приостанавливает поток, из которого он был вызван на указанное число миллисекунд. Ниже приведена общая форма объявления данного метода.
static void sleep(long миллисекунд) throws InterruptedException
Единственный параметр метода sleep () задает время задержки, определяемое числом миллисекунд. Как следует из объявления этого метода, в нем может быть сгенерировано исключение InterruptedException. Следовательно, его нужно вызывать в блоке try. Имеется и другой вариант метода sleep (), позволяющий точнее указывать время задержки в миллисекундах и дополнительно в наносекундах. Когда метод sleep () вызывается в методе run (), исполнение потока приостанавливается на 400 миллисекунд на каждом шаге цикла. Благодаря этому поток исполняется достаточно медленно, чтобы можно проследить за ним.
В методе main () создается новый объект типа Thread. Для этой цели служит приведенная ниже последовательность операторов.
// сначала построить объект типа MyThread
MyThread mt = new MyThread("Child #1");
// далее сформировать поток из этого объекта
Thread newThrd = new Thread(mt);
// и, наконец, начать исполнение потока
newThrd.start();
Как видите, сначала создается объект типа MyThread, а затем он используется для построения объекта типа Thread. Его можно передать конструктору класса Thread в качестве параметра, поскольку класс MyThread реализует интерфейс Runnable. И наконец, начинается исполнение нового потока, для чего вызывается метод start (), что приводит к вызову метода run () из порожденного потока. После вызова метода start () управление возвращается к методу main (), где начинается выполнение цикла for. Этот цикл повторяется 50 раз, приостанавливая на 100 миллисекунд исполнение потока на каждом своем шаге. Оба потока продолжают исполняться, разделяя ресурсы
ЦП в однопроцессорной системе до тех пор, пока циклы в них не завершатся. Ниже приведен результат выполнения данной программы. Вследствие отличий в вычислительных средах у вас может получиться несколько иной результат.
Main thread starting.
.Child #1 starting.
....In Child #1, count is 0
.....In Child #1, count is 1
.....In Child #1, count is 2
.....In Child #1, count is 3
.....In Child #1, count is 4
.....In Child #1, count is 5
.....In Child #b count is 6
.....In Child #1, count is 7
.....In Child #1, count is 8
.....In Child #1 count is 9
Child #1 terminating.
Main thread ending
В рассматриваемом здесь первом примере организации многопоточной обработки любопытно также отметить следующее обстоятельство: для демонстрации того факта, что основной и порожденный потоки исполняются одновременно, необходимо задержать завершение метода main () до тех пор, пока не окончится порожденный поток mt. В данном примере это достигается благодаря отличиям во временных характеристиках обоих потоков. Вызовы метода sleep () из цикла for в методе main () приводят в итоге к задержке на 5 секунд (50 шагов цикла х 100 миллисекунд), тогда как общая задержка с помощью того же самого метода в аналогичном цикле в методе run () составляет лишь 4 секунды (10 шагов цикла х 400 миллисекунд). Поэтому метод run () завершится приблизительно на 1 секунду раньше, чем метод main (). В итоге основной и порожденный потоки будут выполняться параллельно до тех пор, пока не завершится порожденный поток mt. А приблизительно через одну секунду завершится и основной поток в методе main ().