Главная » Java » Класс Runtime

0

Объекты класса 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();

}

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

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. Каждая реализация может поступать с этими вызовами так, как сочтет нужным, в том числе и игнорировать их, если некуда вывести результаты трассировки. Вероятно, эти методы будут применяться в первую очередь в средах разработки.

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

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

public static void setSecurityManager(SecurityManager s)

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

public static SecurityManager getSecurityManager()

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

Источник: Арнольд К., Гослинг Д. – Язык программирования Java (1997)

По теме:

  • Комментарии