Кен Арнольд Джеймс Гослинг
Вид материала | Документы |
Содержание14.5. Класс Runtime |
- Джеймс трефил, 41001.36kb.
- Джеймс А. Дискретная математика и комбинаторика [Текст] / Джеймс А. Андерсон, 42.79kb.
- Человеческая способность эти ценности производить и использовать; является важнейшей, 110.76kb.
- Джеймс блиш города в полете 1-4 триумф времени вернись домой, землянин жизнь ради звезд, 10495.38kb.
- Джеймс Н. Фрей. Как написать гениальный роман, 2872.12kb.
- Дп «авто интернешнл» Київ, вул. Урицького, 1а Тел. (044) 20-60-333 Факс. (044) 20-60-343, 82.44kb.
- Тема Кол-во страниц, 26.85kb.
- Тема Кол-во страниц, 56.3kb.
- Тема Кол-во страниц, 20.7kb.
- Арнольд И. В. Стилистика современного английского языка, 20.42kb.
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. Каждая реализация может поступать с этими вызовами так, как сочтет нужным, в том числе и игнорировать их, если некуда вывести результаты трассировки. Вероятно, эти методы будут применяться в первую очередь в средах разработки.