Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования JAVA.pdf
Скачиваний:
374
Добавлен:
02.05.2014
Размер:
2.57 Mб
Скачать

converted to PDF by BoJIoc

Напишите программу, которая выполняет exec для аргументов, переданных в командной строке, и выводит результаты работы, причем каждой строке предшествует ее номер.

Упражнение 14.3

Напишите программу, которая выполняет exec для аргументов, переданных в командной строке, и выводит результаты, прекращая работу процесса, когда на выходе появляется заранее определенная строка.

14.5. Класс Runtime

Объекты класса Runtime описывают состояние runtime-системы Java и те операции, которые она может выполнить. Для получения объекта Runtime, соответствующего текущему runtime-контексту, следует вызвать статический метод Runtime.getRuntime.

Одна из операций, выполняемых текущим runtime-контекстом,получение входного или выходного потока, переводящего символы локального набора в их Unicode-эквиваленты. Многие существующие системы работают с национальными алфавитами, использующими 8-разрядные или иные наборы символов, конфликтующие с Unicode. Runtime-контекст предоставляет средства для перевода символов потока, работающего с локальным набором, в эквивалентные им символы Unicode. Например, клавиатура может генерировать 8-разрядный символьный код Oriya. Если воспользоваться потоком System.in, который читает символы с этой клавиатуры и получает от нее локализованный входной поток, символы Oriya будут переводиться в их 16-разрядные эквиваленты Unicode в диапазоне \u0b00–\u0b7f. Локализованный выходной поток выполняет обратное преобразование.

Runtime-контекст может быть уничтожен, для этого следует вызвать его метод exit и передать ему код завершения. Метод уничтожает все потоки в текущем runtime- контексте, независимо от их состояния. При этом для уничтожения потоков не используется исключение ThreadDeath; они просто останавливаются без выполнения условий finally. Для уничтожения всех программных потоков в вашей группе лучше пользоваться методом Thread Group.stop, который позволяет потокам выполнить завершающие действия в соответствии с условиями finally.

По традиции, завершающий код exit, равный нулю, означает успешное завершение задачи, а отличный от нуля неудачу. Существует два способа передачи информации с кодом завершения. Первый немедленно вызвать exit и остановить все потоки. Второй убедиться, что все потоки чистозавершились , и только потом вызывать exit. Приведенный ниже пример останавливает все потоки в текущей группе, дает им завершиться и затем вызывает exit:

public static void safeExit(int status) { // получить список всех потоков

Thread myThrd = Thread.currentThread(); ThreadGroup thisGroup = myThrd.getThreadGroup(); int count = thisGroup.activeCount();

Thread[] thrds = new Thread[count + 20]; // +20 на всякий

// случай

thisGroup.enumerate(thrds);

// остановить все потоки

for (int i = 0; i << thrds.length; i++) {

if (thrds[i] != null && thrds[i] != myThrd) thrds[i].stop();

}

// дождаться завершения всех потоков

converted to PDF by BoJIoc

for (int i = 0; i << thrds.length; i++) {

if (thrds[i] != null && thrds[i] != myThrd) { try {

thrds[i].join();

}catch (InterruptedException e) {

//пропустить поток

}

}

}

// теперь можно выходить

System.exit(status);

}

Упражнение 14.4

Модифицируйте метод safeExit так, чтобы он обрабатывал потоки, которые могли быть созданы после вызова enumerate. Кроме того, метод должен пропускать потоки-демоны, которые будут уничтожаться автоматически.

14.6. Разное

Два метода класса System не принадлежат ни к одной из категорий:

public static long currentTimeMillis()

Возвращает текущее время по Гринвичу в миллисекундах, считая от начала эпохи (00:00:00 UTC, 1 января 1970 года). Время возвращается в виде значения long, поэтому переполнение наступит лишь в 292280995 году для большинства практических целей этого вполне хватает. Для более сложных приложений может пригодиться класс Date; см. раздел Класс Date”.

public static void arraycopy(Object src, int srcPos, Object dst, int dstPos, int count)

Копирует содержимое исходного массива начиная с элемента src[srcPos] в целевой массив с элемента dst[dstPos]. Копируется ровно count элементов. Все ссылки на элементы должны лежать в пределах массива, иначе возбуждается исключение IndexOutOfBoundsException. Типы данных исходного массива должны быть совместимы с типами целевого массива, иначе возбуждается исключение ArrayStoreException. “Совместимостьследует понимать следующим образом: для массивов, содержащих ссылки на объекты, каждый объект исходного массива должен присваиваться соответствующему элементу целевого массива. Для массивов со значениями встроенных типов типы должны совпадать, а не просто быть совместимыми по присваиванию; метод arraycopy не может применяться для копирования массива short в массив int.

Метод arraycopy правильно работает с перекрывающимися массивами, поэтому он может применяться для копирования одной части массива в другую. Например, вы можете сдвинуть все содержимое массива на один элемент к началу, как это было сделано в методе squeezeOut.

Два трассировочных метода класса Runtime, traceInstructions и trace MethodCalls, также не относятся ни к одной категории. Каждому из них передается логический аргумент; если он равен true, включается трассировка инструкций или вызовов методов соответственно. Чтобы отключить трассировку, следует вызвать метод с аргументом равным false. Каждая реализация может поступать с этими вызовами так, как сочтет нужным, в том числе и игнорировать их, если некуда вывести результаты трассировки. Вероятно, эти методы будут применяться в первую очередь в средах разработки.

converted to PDF by BoJIoc

14.7. Безопасность

Класс System содержит два метода для работы с объектом класса Security Manager. Класс SecurityManager включает в себя методы, которые разрешают или запрещают открытие сокетов (sockets), доступ к файлам, создание программных потоков и т. д. Подробности о работе менеджера безопасности приведены в спецификации “Java Language Specification”.

public static void setSecurityManager(SecurityManager s)

Задает системный объект, который является менеджером безопасности. Данное значение может быть присвоено только один раз, чтобы при настройке безопасности системы можно было рассчитывать на то, что оно не изменится.

public static SecurityManager getSecurityManager()

Выдает системный объект менеджера безопасности. Описание менеджера безопасности слишком усложнило бы эту книгу; за подробностями обращайтесь к онлайновой документации.

14.8. Класс Math

Класс Math состоит из статических констант и методов, предназначенных для математических вычислений общего назначения. Все операции выполняются в арифметике double.

Константа Math.E представляет значение числа e (2.7182818284590452354), а Math.PI —

значение числа p (3.14159265358979323846). Значения углов в методах задаются в радианах, а все параметры и возвращаемые значения имеют тип double, если явно не оговорено обратное:

 

 

Функция

Значение

 

 

 

 

sin(a)

синус a

 

 

 

 

cos(a)

косинус a

 

 

 

 

tan(a)

тангенс a

 

 

 

 

asin(v)

арксинус v, где v лежит в диапазоне [–1.0, 1.0]

 

 

 

 

acos(v)

арккосинус v, где v лежит в диапазоне [–1.0, 1.0]

 

 

 

 

>atan(v)

арктангенс v, возвращается в диапазоне [–p/2, p/2]

 

 

 

 

atan2(x,y)

арктангенс x/y, возвращается в диапазоне [–p, p]

 

 

 

 

exp(x)

ex

 

 

pow(y,x)

yx

 

 

log(x)

натуральный логарифм x

 

 

 

 

sqrt(x)

квадратный корень из x

 

 

 

 

ceil(x)

наименьшее целое число x

 

 

 

 

floor(x)

наибольшее целое число x

 

 

 

 

converted to PDF by BoJIoc

rint(x)

возвращает округленное целое значение x в виде double

 

 

 

 

round(x)

возвращает (int)floor(x+0.5) в виде double или float

 

 

 

 

abs(x)

возвращает модуль x для любого числового типа

 

 

 

 

max(x,y)

возвращает наибольшее из чисел x и y, относящихся к любому числовому

типу

 

 

 

 

 

min(x,y)

возвращает наименьшее из чисел x и y, относящихся к любому числовому

типу

 

 

 

 

 

Статический метод Math.IEEERemainder вычисляет остаток в соответствии со стандартом IEEE-754. Оператор вычисления остатка %, описанный в разделе 5.15.1, подчиняется

правилу

(x/y)*y + x%y == x

При этом сохраняется всего один вид симметрии, а именно: если x%y равно z, то изменение знака x или y изменит знак z, но не повлияет на абсолютную величину. Например, 7%2.5 дает 2.0, а -7%2.5 равняется 2.0. Стандарт IEEE определяет поведение остатка для x и y иначе, сохраняя симметрию расположения на числовой оси результат Math.IEEERemainder(-7, 2.5) будет равен -0.5. Оператор вычисления остатка делает значения симметричными относительно нуля на числовой оси, тогда как механизм работы с остатком по стандарту IEEE разносит получившиеся величины на y единиц. Метод присутствует потому, что обе разновидности остатка могут пригодиться.

Статический метод random генерирует псевдослучайное число r в диапазоне 0,0 r 1,0.

Средства для более точного управления псевдослучайными числами рассматриваются в разделе Класс Random” на стр. .

Упражнение 14.5

Напишите программу-калькулятор, которая работает со всеми этими функциями, а также (по меньшей мере) с базовыми операторами +, -, *, / и %. Вероятно, проще всего будет реализовать калькулятор с обратной польской нотацией, поскольку приоритет операторов значения не имеет.