- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
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
Реализация интерфейса Runnable — это лишь один из способов получения экземпляров потоковых объектов. Другой способ состоит в создании подкласса, производного от класса Thread. В этом проекте будет продемонстрировано, каким образом расширение класса Thread позволяет реализовать такие же функциональные возможности, как и у рассмотренной выше программы UseThreadsImproved.
В подклассе, производном от класса Thread, нужно переопределить метод run (), который является точкой входа в новый поток. Для того чтобы начать исполнение нового потока, следует вызвать метод start (). Можно также переопределить и другие методы из класса Thread, но делать это не обязательно.
Последовательность действий
Создайте файл ExtendThread.java. Скопируйте в этот файл исходный код второго рассмотренного ранее примера программы (файл UseThreadsImproved. java).
Измените объявление класса MyThread. Теперь он должен быть подклассом, производным от класса Thread, как показано ниже. class MyThread extends Thread {
Удалите следующую строку кода: Thread thrd; Переменная thrd уже не нужна, поскольку класс MyThread включает в себя экземпляр класса Thread и может ссылаться на самого себя.
Внесите в конструктор класса Thread следующие изменения: // построить новый поток. MyThread(String name) { super(name); // присвоить потоку имя start(); // начать поток } Как видите, в данном конструкторе присутствует ключевое слово super, которое используется для вызова следующего варианта конструктора Thread: Thread(String имя); где имя обозначает присваиваемое потоку конкретное имя.
Внесите приведенные ниже изменения в метод run (), чтобы он вызывал метод getName () непосредственно, не предваряя его именем переменной thrd. // начать исполнение нового метода public void run () { System.out.println(getName() + " starting."); try { for(int count=0; count < 10; count++) { Thread.sleep(400); System.out.println("In " + getName() + ", count is " + count); } } catch(InterruptedException exc) { System.out.println(getName() + " interrupted."); } System.out.println(getName() + " terminating."); }
Ниже приведен весь исходный код программы, в которой вместо реализации интерфейса Runnable используется подкласс, производный от класса Thread. Выполнение этой программы дает такой же результат, как и предыдущие ее версии. /* Пример для опробования 11.1. Расширение класса Thread. */ class MyThread extends Thread { // построить новый поток MyThread(String name) { super(name); // присвоить потоку имя start (); // начать поток } // начать исполнение нового потока public void run() { System.out.println(getName() + " starting."); try { for(int count=0; count < 10; count++) { Thread.sleep(400); System.out.println("In " + getName() + ", count is " + count); } } catch(InterruptedException exc) { System.out.println(getName() + " interrupted."); } System.out.println(getName() + " terminating."); } } class ExtendThread { 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."); } }Создание нескольких потоков
В предыдущем примере был создан только один порожденный поток. Но в программе можно породить столько потоков, сколько требуется. Например, в приведенной ниже программе формируются три порожденных потока.// Создание нескольких потоков.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; count < 10; 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 MoreThreads { public static void main(String args[]) { System.out.println("Main thread starting."); // Создание и запуск на исполнение трех потоков. MyThread mtl = new MyThread("Child #1"); MyThread mt2 = new MyThread("Child #2"); MyThread mt3 = new MyThread("Child #3"); 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."); }}
Ниже приведен результат выполнения данной программы.Main thread starting.Child #1 starting..Child #2 starting.Child #3 starting....In Child #3, count is ОIn Child #2, count is 0In Child #1, count is 0....In Child #1, count is 1In Child #2, count is 1In Child #3, count is 1....In Child #2, count is 2In Child #3, count is 2In Child #1, count is 2...In Child #1, count is 3In Child #2, count is 3In Child #3, count is 3....In Child #1, count is 4In Child #3, count is 4In Child #2, count is 4....In Child #1, count is 5In Child #3, count is 5In Child #2, count is 5...In Child #3, count is 6.In Child #2, count is 6In Child #1, count is 6...In Child #3, count is 7In Child #1, count is 7In Child #2, count is 7....In Child #2, count is 8In Child #1, count is 8In Child #3, count is 8....In Child #1, count is 9Child #1 terminating.In Child #2, count is 9Child #2 terminating.In Child #3, count is 9Child #3 terminating. Main thread ending.

