Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция
Скачать 25.04 Mb.
|
boolean suspendFlag; NewThread(String threadname, ThreadGroup tgOb) { super(tgOb, Новый поток " + this); suspendFlag = false; start(); // Запуск потока' Точка входа потока public void r u n () { try { for (int i = 5; i > 0 ; i--) { System.out.println(getName() + " + i ) ; Thread.sleep(1000); synchronized(this) { w h i l e (suspendFlag) { w a i t (); } } } } catch (Exception e) Исключение в " + getName()); } System.out.println(getName() + " завершается void mysuspend() { suspendFlag = true; } synchronized void myresume() { suspendFlag = false; n o t i f y (); } } Глава 16. Пакет java.lang 4 6 3 :lass ThreadGroupDemo { public static void main(String a r g s []) { ThreadGroup groupA = new Группа A"); ThreadGroup groupB = new Группа В obi = new Один groupA); NewThread ob2 = new Два groupA); NewThread ob3 = new Три groupB); NewThread ob4 = new Четыре, groupB); System.out.println("ХпВывод из list():"); groupA.list(); groupB.l i s t (Прерывается группа A"); Thread t g a [] = new Thread[groupA.activeCount()]; groupA.enumerate(tga); // получить потоки группы i = 0; i < tga.length; i++) { ((NewThread)tga[i ]).mysuspend(); // приостановить каждый поток { Thread.sleep(4000); } catch (InterruptedException e) Главный поток прерван."); } System.out.println("Возобновление Group A " ); for(int i = 0; i < tga.length; i++) { ((NewThread)tga[i]) .myresume(); // возобновить все потоки в группе Ожидать завершения потоков try Ожидание останова потоков b i .j o i n (); o b 2 .j o i n (о Ь З .j o i n (); o b 4 .j o i n (); } catch (Exception e) Исключение в основном потоке"); } System.out.println("Основной поток завершен."); Пример вывода этой программы показан ниже (точный вывод, который вы увидите, может несколько отличаться). Новый поток T h read[Один,5,Группа А] Новый поток T h read[Два,5,Группа А] Новый поток T h read[Три,5,Группа В] Новый поток Thread[Четыре,5,Группа В] Вывод из list () : java.lang.ThreadGroup[name=Group А,тахрг1=10] Thread[Один,5,Группа A] Часть II. Библиотека Java Thread[Два,5,Группа А В /maxpri=10] Thread[Три,5,Группа В] Thread[Четыре,5,Группа В Прерывается группа А Три: Четыре Три Четыре Три Четыре Три Четыре Возобновление группы А Ожидание останова потоков. О дин Два 5 Три 1 Четыре 1 Один Два Три завершается. Четыре завершается. О дин Два 3 Один Два 2 Один Два Один завершается. Два завершается. Основной поток завершен. О братите внимание на то, что внутри программы группа А приостанавливается на четыре секунды. Как подтверждает вывод программы, приостанавливается выполнение потоков Один и Два, но потоки Три и Четыре продолжают выполняться. По истечении четырех секунд выполнение потоков Один и Два возобновляется. Обратите также внимание на то, как останавливается и возобновляется выполнение группы А. Сначала потоки из группы А извлекаются вызовом метода e n u m e r a t e () для этой группы. Затем каждый поток приостанавливается в процессе итерации по результирующему массиву. Чтобы продолжить выполнение потоков в группе А, опять осуществляется проход по списку потоков, и каждый поток запускается для продолжения работы. И последний момент в этом примере применяется рекомендованный подход для приостановки и возобновления потоков. Это не касается устаревших (не рекомендованных) методов s u s p e n d ( ) и r e s u m e ( ) Классы ThreadLocal и В пакете j a v a . l a n g определены два дополнительных класса, имеющих отношение к потокам. • Класс T h r e a d L o c a l используется для создания локальных переменных потоков. Каждый поток будет иметь собственную копию локальной переменной потока Глава 16. Пакет java.lang Д 6 Класс InheritableThreadLocal создает локальные переменные потоков, которые могут наследоваться. Класс Этот класс инкапсулирует данные о версии, ассоциированные с пакетом. Информация о версии пакета приобретает особую ценность из-за профилирования пакетов, а также потому, что программы Java могут нуждаться в знании о том, какая версия пакета доступна. Методы, определенные в классе Package, перечислены в табл. 16.24. В следующей программе демонстрируется использование класса Package, отображающего список пакетов, с которыми имеет дело программа в данный момент Демонстрация применения Package class PkgTest { public static void m a i n ( S t n n g args [ ] ) { Package p k g s []; pkgs = Package.getPackages(); for(int i=0; i < pkgs.length; i + +) System.out.println( p k g s [i ].getName() + " " + p k g s [i ].getlmplementationTitle() + " " + p k g s [i ].getImplementationVendor() + " " + p k g s [i ].getlmplementationVersion() ) Таблица 16.24. Методы, определенные в классе Package Метод Описание <А extends Annotation> A getAnnotation(Class тип Аннотации n o t a t i o n s () A n n o t a t i o n [ ] g e t D e c l a r e d A n n o t a t i o n s () String g e t l m p l e m e n t a t i o n T i t l e () String g e t l m p l e m e n t a t i o n V e n d o r () String g e t l m p l e m e n t a t i o n V e r s i o n () String g e t N a m e () static Package getPackage(String имя Пакета Возвращает объект интерфейса Annotation, который содержит аннотацию, ассоциированную с типАннота ц ии , для вызывающего объекта Возвращает все аннотации, ассоциированные с вызывающим объектом в массиве объектов интерфейса Annotation. Возвращает ссылку на этот массив Возвращает объект интерфейса Annotation для всех аннотаций, объявленных в вызывающем объекте (унаследованные аннотации игнорируются) Возвращает заголовок вызывающего пакета Возвращает имя реализатора вызывающего пакета Возвращает цомер версии вызывающего пакета Возвращает имя вызывающего пакета Возвращает объект класса Package по имени, указанном в параметре имяПакета 4 6 Часть И. Библиотека Окончание табл. 16.24 Метод Описание s t a t i c P a c k a g e [] g e t P a c k a g e s () S t r i n g g e t S p e c i f i c a t i o n T i t l e () S t r i n g g e t S p e c i f i c a t i o n V e n d o r () S t r i n g g e t S p e c i f i c a t i o n V e r s i o n () int h a s h C o d e () b o o l e a n i s A n n o t a t i o n P r e s e n t ( C l a s s < ? e x t e n d s A n n o t a t i o n > аннотация o o l e a n i s C o m p a t i b l e W i t h (S t r i n g номерВерсии) t h r o w s N u m b e r F o r m a t E x c e p t i o n b o o l e a n isSeal e d ( ) b o o l e a n i s S e a l e d ( U R L u r l) S t r i n g t o S t r i n g (Возвращает все пакеты, о которых осведомлена текущая выполняющаяся программа Возвращает титул спецификации вызывающего пакета Возвращает имя владельца из спецификации вызывающего пакета Возвращает номер версии спецификации вызывающего пакета Возвращает хеш-код вызывающего пакета Возвращает значение true, если аннотация, описанная параметром аннотация, ассоциируется с вызывающим объектом. В противном случае возвращает значение f a Возвращает значение true, если номерВерсии меньше номера версии вызывающего пакета или равно ему Возвращает значение true, если вызывающий пакет запечатан (sealed). В противном случае возвращает значение Возвращает значение true, если вызывающий пакет запечатан (sealed) относительно u r В противном случае возвращает значение fa l s Возвращает строковый эквивалент вызывающего пакета Класс Класс R u n tim e P e r m is s io n относится к механизму безопасности Java и подробно здесь не рассматривается. Класс Класс T h ro w a b le поддерживает систему обработки исключений Java и представляет собой класс, от которого происходят все классы исключений. Этот класс рассматривался в главе Класс Это — класс, от которого можно наследовать подклассы для создания диспетчера безопасности. В общем случае, как правило, нет необходимости реализовывать собственный диспетчер безопасности. Если вы все же решите это сделать, проконсультируйтесь с документацией, поставляемой с системой разработки Java. Класс Глава 16. Пакет java.lang 6 6 Класс StackTraceElement описывает единственный стековый фрейм, который представляет собой индивидуальный элемент трассировки стека при возникновении исключения. Каждый стековый фрейм представляет точку выполнения, которая включает имя класса, имя метода, имя файла и номер строки исходного кода. Массив элементов класса StackTraceElement возвращается методом get- StackTrace() класса Класс StackTraceElement имеет один конструктор имяКласса, String имяМетода, String имяФайла, int строка) Здесь имя класса указано в параметре имяКласса , имя метода — в параметре у_мяМетода, имя файла — в параметре имяФайла , а номер строки передается в па- оаметре строка Если нет допустимого номера строки, используйте отрицательное значение строка Более того, значение -2 для параметра строка означает, что этот фрейм ссылается на машинно-зависимый (native) метод. Методы, поддерживаемые классом StackTraceElement, перечислены в табл. 16.25. Они предоставляют программе доступ к ее трассировке стека. Таблица 16.25. Методы, определенные в классе StackTraceElement Мете# Описание boolean Возвращает значение true, если вызывающий объект объект) класса StackTraceElement тот же, что передан в параметре объект. В противном случае возвращает значение g e t C l a s s N a m e (Возвращает имя класса, в котором точка выполнения описана вызывающим объектом класса g e t F i l e N a m e (Возвращает имя файла, в котором исходный код точки выполнения описан хранимым вызывающим объектом класса StackTraceElement :nt g e t L i n e N u m b e r (Возвращает номер строки исходного кода, в котором точка выполнения описана вызывающим объектом класса StackTraceElement. В некоторых ситуациях номер строки не будет доступен, тогда возвращается отрицательное значение g e t M e t h o d N a m e (Возвращает имя метода в, в котором точка выполнения описана вызывающим объектом класса h a s h C o d e (Возвращает хеш-код вызывающего объекта класса i s N a t i v e M e t h o d (Возвращает значение true, если точка выполнения описана вызывающим объектом класса, находящимся в машинно зависимом методе. В противном случае возвращает значение false String t o S t r i n g (Возвращает строковый эквивалент вызывающей последовательности Часть II. Библиотека Класс Как было описано в главе 12, перечисление (enum eration) — это список именованных констант. (Вспомните, что перечисление создается ключевым словом enum.) Все перечисления автоматически наследуются от класса Enum. Класс Enum — это обобщенный класс, объявленный следующим образом Enum < Е Здесь Е обозначает перечислимый тип. Класс Enum не имеет открытых кон структоров. В классе Enum определено несколько методов, доступных для использования всеми перечислителями. Они описаны в табл. Таблица 16.26. Методы, определенные в классе E n u m Метод _________ Описание . .______ , - * . ' ; p r o t e c t e d final O b j e c t c l o n e () t h r o w s C l o n e N o t S u p p o r t e d E x c e p t i o n fi nal int c o m p a r e T o ( E e) final b o o l e a n e q u a l s ( O b j e c t объект C l a s s < E > g e t D e c l a r i n g C l a s s () final int h a s h C o d e () final S t r i n g n a m e () final int o r d i n a l () S t r i n g t o S t r i n g () s t a t i c T v a l u e O f ( C l a s s < T > е-тип, S t r i n g имя) Класс Класс C l a s s V a l u e , добавленный в комплекте JDK 7, применяется для связи значения с типом. Это обобщенный тип, определенный так Class Val ue< Он предназначен для узкоспециализированного использования, а не для обычного программирования. Вызов этого метода инициирует передачу исключения C l o n e N o t S u p p o r t e d E x c e p t i o n . Это предотвращает клонирование перечислений Сравнивает порядковое значение двух констант одного перечисления. Возвращает отрицательное значение, если вызывающая константа имеет порядковое значение меньшее, нуль — если порядковое значение совпадает се и больше нуля — если значение больше е Возвращает значение true, если объект и вызывающий объект ссылаются на одну и туже константу Возвращает тип перечисления, членом которого является вызывающая константа Возвращает хеш-код вызывающего объекта Возвращает неизменяемое имя вызывающей кон станты Возвращает значение, которое указывает позицию перечислимой константы в списке констант Возвращает имя вызывающей константы. Это имя может отличаться оттого, которое использовалось при объявлении перечисления Возвращает константу, ассоциированную с имя, в типе перечисления, заданном е-тип Глава 16. Пакет java.lang 4 6 Интерфейс Интерфейс CharSequence определяет методы, которые предоставляют доступ только для чтения к последовательности символов. Методы описаны в табл. 16.27. Этот интерфейс реализован в классах String, St г ingBuf f er, St r ingBui lder и др. Таблица 16.27. Методы, определенные в интерфейсе CharSequence Метод Описание Возвращает символ, находящийся в позиции, указанной индексом индекс Возвращает количество символов в вызывающей последовательности subsequence (int Возвращает подмножество вызывающей последо- нач Индекс кон Индекс ) вательности, начиная сна ч Индекс и заканчивая кон Индекс- Возвращает строковый эквивалент вызывающей последовательности charAt(int индекс (Интерфейс Объекты классов, реализующих интерфейс Comparable, могут быть упорядочены. Другими словами, классы, реализующие интерфейс Comparable, содержат объекты, которые можно сравнивать некоторым осмысленным образом. Интерфейс это обобщенный интерфейс, объявленный следующим образом Здесь Т представляет собой тип сравниваемых объектов. И нтерфейс Comparable объявляет один метод, который используется для определения того, что в языке Java называется натуральным порядком экземпляров класса. Сигнатура метода показана ниже Т объект Этот метод сравнивает вызывающий объект с указанным параметром объект Возвращает значение 0, если значения эквивалентны. Отрицательное значение возвращается, если вызывающий объект имеет меньшее значение. В противном случае возвращается положительное значение. Этот интерфейс реализован в нескольких классах, уже рассмотренных ранее. В частности, классы Byte, Character, Double, Float, Long, Short, String и Integer определяют метод compareTo ( ). В дополнение, как показано в следующей главе, объекты, которые реализуют этот интерфейс, могут быть использованы в разных коллекциях. Интерфейс Объекты классов, реализующих интерфейс Appendable, позволяют добавлять к своим объектам символы или символьные последовательности. Интерфейс определяет следующие три метода 4 7 Часть II. Библиотека Java Appendable append(char символ throws IOException Appendable append(CharSequence символы throws IOException Appendable append(CharSequence символы int начало int конец throws Впервой форме символ символ добавляется к вызывающему объекту. Во второй форме к вызывающему объекту добавляется последовательность символов символы Третья форма позволяет указать фрагмент (с символа, заданного параметром начало, док он е ц - 1) последовательности символы Во всех случаях возвращается ссылка на вызывающий объект. Интерфейс Интерфейс должен быть реализован всеми классами, объекты которых будут использованы в версии “for-each” цикла f o r . Другими словами, для того, чтобы объект использовался внутри цикла “for-each”, его класс должен реализовывать интерфейс цикла I t e r a b l e . Интерфейс I t e r a b l e — это обобщенный интерфейс, имеющий следующее объявление, interface Здесь Т представляет собой тип объектов, по которым выполняется итерация. Он определяет один метод, i t e r a t o r ( ) , показанный ниже Метод возвращает итератор, связанный с элементами, содержащимися в вызывающем объекте. На заметку Итераторы рассматриваются в главе Интерфейс Интерфейс R e a d a b l e указывает, что объект может быть использован в качестве источника символов. В этом интерфейсе определен один метод — r e a d ( ) . int read(CharBuffer буфер throws Этот метод читает символы в буфер Возвращает количество прочитанных символов или -1 — в случае достижения символа конца файла (Интерфейс Интерфейс A u t o C l o s e a b l e , добавленный в JDK 7, обеспечивает поддержку для нового оператора t r y с ресурсами реализующего то, что иногда называется автоматическим управлением ресурсами (Automatic Resource Management — ARM). Оператор t r y с - ресурсами автоматизирует процесс освобождения ресурса такого, как поток, когда он больше ненужен. (Более подробная информация по этой теме приведена в главе 13.) Только объекты классов, реализующих интерфейс A u t o C l o s e a b l e , могут применяться с оператором t r y -с ресурсами Интерфейс A u t o C l o s e a b l e определяет только метод c l o s e ( ) , приведенный ниже, |