Java руководство для начинающих - Шилдт Герберт (2012)
-
Год:2012
-
Название:Java руководство для начинающих
-
Автор:
-
Жанр:
-
Оригинал:Английский
-
Язык:Русский
-
Издательство:Вильямс
-
Страниц:316
-
ISBN:978-5-8459-1770-6
-
Рейтинг:
-
Ваша оценка:
Java руководство для начинающих - Шилдт Герберт читать онлайн бесплатно полную версию книги
Отличий во временнь/х характеристиках обоих потоков в данном и ряде последующих простых примеров оказывается достаточно для того, чтобы основной поток в методе main () завершился последним, но на практике этого, как правило, оказывается недостаточно. В Java предоставляются намного более совершенные способы, позволяющие организовать ожидание завершения потока. Далее в этой главе будет продемонстрирован более совершенный способ организации ожидания одним потоком завершения другого.
И последнее замечание: многопоточная программа обычно разрабатывается с таким расчетом, чтобы последним завершал свою работу основной поток. Как правило, выполнение программы продолжается до тех пор, пока все потоки не завершат работу. Поэтому завершение основного потока является не требованием, а рекомендуемой для наследования нормой, особенно для тех, кто лишь начинает осваивать многопоточное программирование.
Несложные усовершенствования многопоточной программы
Рассмотренная выше многопоточная программа вполне работоспособна, тем не менее ей не помешает небольшая доработка, повышающая ее эффективность. Во- первых, можно сделать так, чтобы поток начинал исполняться сразу после создания. Эта цель достигается созданием экземпляра объекта типа Thread в конструкторе класса MyThread. И во-вторых, нет никакой нужды хранить в объекте типа MyThread имя потока, но присвоить имя потоку при его создании. Эту задачу позволяет решить следующий вариант конструктора Thread:
Thread(Runnable threadOb, String имя)
где имя обозначает конкретное наименование потока.
Получить имя потока можно, используя метод getName (), определенный в классе Thread. Ниже приведено объявление этого метода.
final String getName()
В приведенной ниже программе имя присваивается потоку после его создания с помощью метода setName (). И хотя в этом нет особой необходимости, такое решение выбрано лишь для того, чтобы продемонстрировать возможности класса Thread. Объявление метода setName () имеет следующий вид:
final void setName(String имя_потока)
где имя_потока обозначает имя, которое присваивается потоку.
Ниже приведена видоизмененная версия предыдущей программы.
// Видоизменение класса MyThread.
class MyThread implements Runnable {
Thread thrd; // В этой переменной хранится ссылка на поток.
// построить новый поток
MyThread(String name) {
thrd = new Thread(this, name); // Поток именуется при его создании,
thrd.start() ; // Начало исполнения потока.
}
// начать исполнение нового потока
public void run() {
System.out.println(thrd.getName() + " starting.");
try {
for (int count=0; countclO; count++) {
Thread.sleep(400);
System.out.println("In " + thrd.getName() +
", count is " + count)';
}
}
catch(InterruptedException exc) {
System.out.println(thrd.getName() + " interrupted.");
}
System.out.println(thrd.getName() + " terminating.");
}
}
class UseThreadsImproved {
public static void main(String args[]) {
System.out.println("Main thread starting.");
// Теперь поток начинается при его создании.
MyThread mt = new MyThread("Child #1");
for (int i=0; i < 50; i++) {
System.out.print(".") ;
try {
Thread.sleep(100) ;
}
catch(InterruptedException exc) {
System.out.println("Main thread interrupted.");
}
}
System.out.println("Main thread ending.");
}
}
Эта версия программы дает такой же результат, как и предыдущая. Обратите внимание на то, что ссылка на поток хранится в переменной thrd экземпляра класса MyThread.
Пример для опробования 11.1.
Расширение класса Thread