Добавить в цитаты Настройки чтения

Страница 84 из 133

Рассмотренная выше многопоточная программа вполне работоспособна, тем не менее ей не помешает небольшая доработка, повышающая ее эффективность. Во- первых, можно сделать так, чтобы поток начинал исполняться сразу после создания. Эта цель достигается созданием экземпляра объекта типа Thread в конструкторе класса MyThread. И во-вторых, нет никакой нужды хранить в объекте типа MyThread имя потока, но присвоить имя потоку при его создании. Эту задачу позволяет решить следующий вариант конструктора Thread:Thread(Ru

где имя обозначает конкретное наименование потока.

Получить имя потока можно, используя метод getName (), определенный в классе Thread. Ниже приведено объявление этого метода.final String getName()

В приведенной ниже программе имя присваивается потоку после его создания с помощью метода setName (). И хотя в этом нет особой необходимости, такое решение выбрано лишь для того, чтобы продемонстрировать возможности класса Thread. Объявление метода setName () имеет следующий вид:final void setName(String имя_потока)

где имя_потока обозначает имя, которое присваивается потоку.

Ниже приведена видоизмененная версия предыдущей программы.// Видоизменение класса MyThread.class MyThread implements Ru

Эта версия программы дает такой же результат, как и предыдущая. Обратите внимание на то, что ссылка на поток хранится в переменной thrd экземпляра класса MyThread.

Пример для опробования 11.1.Расширение класса Thread

Реализация интерфейса Ru

В подклассе, производном от класса 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."); }

Ниже приведен весь исходный код программы, в которой вместо реализации интерфейса Ru

В предыдущем примере был создан только один порожденный поток. Но в программе можно породить столько потоков, сколько требуется. Например, в приведенной ниже программе формируются три порожденных потока.// Создание нескольких потоков.class MyThread implements Ru

Ниже приведен результат выполнения данной программы.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.