Выбрать главу

1. wait — приводит к тому, что текущий подпроцесс отдает управление и переходит в режим ожидания до тех пор пока другой подпроцесс не вызовет метод notify с тем же объектом;

2. notify — выводит из состояния ожидания первый из подпроцессов, вызвавших wait с данным объектом;

3. notifyAll — выводит из состояния ожидания все подпроцессы, вызвавшие wait с данным объектом.

10.6. Методы программного интерфейса легковесных процессов

Ниже приведена сводка всех методов класса Thread.

10.6.1. Методы класса

Методы класса — это статические методы, которые можно вызывать непосредственно с именем класса Thread.

1. currentThread - этот статический метод возвращает объект Thread, выполняющийся в данный момент;

2. yield - вызов метода приводит к тому, что исполняющая система переключает контекст с текущего на следующий доступный подпроцесс. Это один из способов гарантировать, что низкоприоритетные подпроцессы

3. когда-нибудь получат управление;

4. sleep(int n) - при вызове метода исполняющая система блокирует текущий подпроцесс на n миллисекунд. После того, как этот интервал времени закончится, подпроцесс снова будет способен выполняться. В большинстве исполняющих систем Java системные часы не позволяют точно выдерживать паузы короче, чем 10 миллисекунд. 10.6.2. Методы объекта

1. start - метод говорит исполняющей системе Java, что необходимо создать системный контекст подпроцесса и запустить этот подпроцесс. После вызова этого метода в новом контексте будет вызван метод run вновь созданного подпроцесса. Вам нужно помнить о том, что метод start с данным объектом можно вызвать только один раз;

2. run - этот метод содержит тело выполняющегося подпроцесса. Это единственный метод интерфейса Runnable. Он вызывается из метода start после того, как исполняющая среда выполнит необходимые операции по инициализации нового подпроцесса. Если происходит возврат из метода run, текущий подпроцесс останавливается;

3. stop - вызов метода приводит к немедленной остановке подпроцесса. Это способ мгновенно прекратить выполнение текущего подпроцесса, особенно если метод выполняется в текущем подпроцессе. В таком случае строка, следующая за вызовом метода stop, никогда не выполняется, поскольку контекст подпроцесса «умирает» до того, как метод stop возвратит управление. Более аккуратный способ остановить выполнение подпроцесса — установить значение какой-либо переменной-флага, предусмотрев в методе run код, который, проверив состояние флага, завершил бы выполнение подпроцесса;

4. setPriority(int р) - метод устанавливает приоритет подпроцесса, задаваемый целым значением, передаваемого методу параметра. В классе Thread есть несколько предопределенных приоритетов-констант: MINJPRIORITY, NORMPRIORITY и MAX PRIORITY, соответствующих значениям 1, 5 и 10. Большинство пользовательских приложений должно выполняться на уровне NORM PRIORITY плюс-минус 1. Приоритет фоновых заданий, например, сетевого ввода-вывода или перерисовки экрана следует устанавливать в MIN_PRIORITY. Запуск подпроцессов на уровне MAX_PRIORITY требует осторожности. Если в подпроцессах с таким уровнем приоритета отсутствуют вызовы sleep или yield, может оказаться, что вся исполняющая система Java перестанет реагировать на внешние раздражители;

5. getPriority - этот метод возвращает текущий приоритет подпроцесса — целое значение в диапазоне от 1 до 10;

setName(String name) - метод присваивает подпроцессу указанное в параметре имя. Это помогает при отладке программ с параллельными подпроцессами. Присвоенное с помощью setName имя будет появляться во всех трассировках стека, которые выводятся при получении интерпретатором неперехваченного исключения;

6. getName - метод возвращает строку с именем подпроцесса, установленным с помощью вызова setName.

11. ввод/вывод

Обобщенное понятие источника ввода относится к различным способам получения информации: к чтению дискового файла, символов с клавиатуры либо получению данных из сети. Аналогично под обобщенным понятием вывода также могут пониматься дисковые файлы, сетевое соединение и т. п. Эти абстракции дают удобную возможность для работы с вводом-выводом (I/O), не требуя при этом, чтобы каждая часть вашего кода понимала разницу между, скажем, клавиатурой и сетью. В Java эта абстракция называется потоком (stream) и реализована в нескольких классах пакета java.io. Ввод инкапсулирован в классе InputStream, вывод — в OutputStream. В Java есть несколько специализаций этих абстрактных классов, учитывающих различия при работе с дисковыми файлами, сетевыми соединениями и даже с буферами в памяти.

11.1. Работа с файлами

File — единственный класс в java.io, который работает непосредственно с дисковыми файлами. Хотя на использование файлов в апплетах наложены жесткие ограничения, файлы по-прежнему остаются основными ресурсами для постоянного хранения и совместного использования информации. Каталог в Java трактуется как обычный файл, но с дополнительным свойством — списком имен файлов, который можно просмотреть с помощью метода list.

Для определения стандартных свойств файла в классе File есть много разных методов. Однако класс File несимметричен. Есть много методов, позволяющих узнать свойства объекта, но соответствующие функции для изменения этих свойств отсутствуют. В очередном примере используются различные методы, позволяющие получить характеристики файла:

import java.io.File;

class FileTest {

static void p(String s) {

System.out.println(s);

}

public static void main(String args[]) {

File fl = new File("/java/COP YRIGHT");

р("Имя файла:" + fl .getName());

р("Путь:" + fl.getPath());

р("Полный путь:" + fl.getAbsolutePath());

р("Родительский каталог:" + fl.getParent());

p(fl.exists() ? "существует" : "не существует");

p(fl.canWrite() ? "можно записывать" : "нельзя записывать");

p(fl.canRead() ? "можно читать" : "нельзя читать");

p("is" + ("Директория? "+fl ,isDirectory() ? "да": " нет");

p(fl.isFile() ? "обычный файл" : "не обычный файл");

р("Последняя модификация файла:" + fl. lastModified());

р("Размер файла:" + fl.length() + " Bytes");

}

}

При запуске этой программы вы получите:

Имя файла: COPYRIGHT

Путь: /java/COPYRIGHT

Полный путь:/Java/COPYRIGHT

Родительский каталог:/java

существует

можно записывать

можно читать

Директория? нет

обычный файл

is absolute

Последняя модификация файла:812465204000

Размер файла:695 Bytes

Существует также несколько сервисных методов, использование которых ограничено обычными файлами (их нельзя применять к каталогам). Метод renameTo(File dest) переименовывает файл (нельзя переместить файл в другой каталог). Метод delete уничтожает дисковый файл. Этот метод может удалять только обычные файлы, каталог, даже пустой, с его помощью удалить не удаётся.

11.2. Каталоги

Каталоги — это объекты класса File, в которых содержится список других файлов и каталогов. Если File ссылается на каталог, его метод isDirectoiy возвращает значение true. В этом случае вы можете вызвать метод list и извлечь содержащиеся в объекте имена файлов и каталогов. В очередном примере показано, как с помощью метода list можно просмотреть содержимое каталога.

import j ava.io.File;

class DirList {