Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GoslingJava2.doc
Скачиваний:
139
Добавлен:
23.02.2016
Размер:
2.39 Mб
Скачать

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();

}

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]