Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ekzamen_GOS.docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
8.21 Mб
Скачать

32. Синхронизация потоков.

Многопоточный режим работы открывает новые возможности для программистов, однако эти возможности приводят к усложнению процесса проектирования приложения и отладки. Основное различие между потоками и процессами состоит в том, что процессы защищены от воздействия друг на друга средствами ОС, но использование потоков, лишенных такой защиты позволяет быстро их запускать и способствует повышению их производительности. Однако существует отрицательный эффект. Любой из потоков может получить доступ и внести изменения в данные, который другой поток считает принадлежащим только ему. Решение такой проблемы состоит в синхронизации потоков. Однопоточная программа, такая, например, как программа MS-DOS, при запуске получает в монопольное распоряжение все ресурсы компьютера. Т.к. в однопоточной системе существует только один процесс, он использует эти ресурсы в той последовательности, которая соответствует логике работы программы. Процессы и потоки, работающие одновременно в многопоточной системе, могут пытаться обращаться одновременно к одним и тем же ресурсам, что может привести к неправильной работе приложений. В языке программирования Java предусмотрено несколько средств для синхронизации потоков. Синхронизация методов . Возможность синхронизации как бы встроена в каждый объект, создаваемый приложением Java. Для этого объекты снабжаются защелками, которые могут быть использованы для блокировки потоков, обращающихся к этим объектам. Чтобы воспользоваться защелками, вы можете объявить соответствующий метод как synchronized, сделав его синхронизированным и гарантирующим доступ к элементу в каждый момент времени только одному потоку.

public synchronized void decrement() {…}

При вызове синхронизированного метода соответствующий ему объект (в котором он определен) блокируется для использования другими синхронизированными методами. Когда один из потоков войдя в критический участок осуществляет захват поля и если другой поток попытается войти, то он будет заблокирован оператором синхронайз, до тех пор, пока первый поток не завершит выполнение данного блока. В результате предотвращается одновременная запись двумя методами значений в область памяти, принадлежащую данному объекту.

Блокировка потока . Синхронизированный поток, определенный как метод типа synchronized, может переходить в заблокированное состояние автоматически при попытке обращения к ресурсу, занятому другим синхронизированным методом, либо при выполнении некоторых операций ввода или вывода. Однако в ряде случаев полезно иметь средства синхронизации, допускающие явное использование по запросу приложения. Блокировка на заданный период времени - С помощью метода sleep можно заблокировать поток на заданный период времени:

try{

Thread.sleep(500);

}catch (InterruptedException ee){ . . .}

33. Система ввода-вывода в Java. Работа с файлами.

Часть вычислительной платформы, которая отвечает за обмен данными называется - система ввода/вывода. В Java она представлена пакетом java.io (input/output). Реализация системы ввода/вывода осложняется не только широким спектром источников и получателей данных, но еще и различными форматами передачи информации (можно обмениваться в двоичном представлении, символьном или текстовом с применением некоторой кодировки, или передавать числа в различных представлениях). Доступ к данным может потребоваться как последовательный (например, считывание HTML страницы), так и произвольный (сложная работа с несколькими частями одного файла). Зачастую для повышения производительности применяется буферизация. В Java для описания работы по вводу/выводу используется специальное понятие поток данных (stream). Поток данных связан с некоторым источником или приемником данных, способных получать или предоставлять информацию. Со-нно, потоки делятся на входные - читающие данные, и на выходные - передающие (записывающие) данные.

В Java потоки естественным образом представляются объектами. Описывающие их классы как раз и составляют основную часть пакета java.io. Они разнообразны и отвечают за разную функциональность. Все классы разделены на 2 части - одни осуществляют ввод , другие вывод.

Существующие стандартные классы помогают решить большинство типичных задач. Минимальной "порцией" информации является, как известно, бит, принимающий значение 0 или 1. Традиционно используется более крупная единица измерения байт, объединяющая 8 бит. Примитивный тип byte в Java в точности соответствует последнему, знаковому диапазону. Базовые классы позволяют считывать и записывать информацию в виде набора байт. Чтобы их было удобно применять в различных задачах, java.io содержит также классы, преобразующие любые данные в набор байт.Все типы поделены на две группы.

InputStream - это базовый класс для потоков ввода, т.е. чтения. Соответственно, он описывает базовые методы для работы с байтовыми потоками данных. Эти методы необходимы всем классам, наследующимся от InputStream.

OutputStream - это базовый класс для потоков вывода.

В языке Java есть много классов для работы с файлами и прочими потоками ввода/вывода, они расположены в пакете java.io. Коротко рассмотрим некоторые из них.

Класс File. служит для получения информации о файлах и каталогах. Для создания объекта этого класса есть 3 конструктора, чаще всего используется следующий: File(String имя_файла) - создание объекта 'файл' по его имени в файловой системе

Следующие 5 классов используются для работы с двоичными файлами:

Класс FileInputStream(производный от InputStream)- простейший класс для потокового (последовательного) чтения данных из файла. Объект этого класса создается на основе объекта File или по имени файла в файловой системе, например, FileInputStream myfile = new FileInputStream("data.txt"); Для чтения данных используются методы - read()читает и возвращает один символ из файла; и read(byte [] массив) - читает и возвращает массив символов из файла. Для закрытия файла есть метод close, определенный в родительском классе InputStream.

Класс FileOutputStream (производный от OutputStream) - простейший класс для потокового (последовательного) вывода данных в файл. Объект этого класса создается на основе объекта File или по имени файла в файловой системе, например, FileOutputStream myfile = new FileOutputStream("data.txt"); Для записи данных используются методы: write(int символ) - печатает один символ в файл; и write(byte [] массив) - печатает массив байтов в файл. Для закрытия файла есть метод close, определенный в родительском классе OutputStream.

Класс DataInputStream (производный от InputStream) - простейший класс для потокового (последовательного) чтения данных стандартных типов из файла. Объект этого класса создается на основе объекта InputStream, т.е., например, DataInputStream myfile = new DataInputStream( new FileInputStream("data.txt")); Для всех стандартных типов данных определены методы: readInt(), readFloat(), readChar()и т.п. - читает значение указанного типа.

Класс DataOutputStream(производный от OutputStream) - простейший класс для потоковой (последовательной) записи данных стандартных типов в файл. Объект этого класса создается на основе объекта OutputStream, т.е., например, DataOutputStream myfile = new DataOutputStream( new FileOutputStream("data.txt")); Для всех стандартных типов данных определены методы: writeInt(int число), writeFloat(float число), writeChar(char символ), writeChars(String строка)и т.п. - печатает значение указанного типа.

Класс RandomAccessFile - класс для работы с файлами произвольного доступа, используется как для чтения, так и для записи. Объект этого класса cоздается на основе объекта File или по имени файла в файловой системе. Для всех стандартных типов данных определены методы: readInt(), readFloat(), readChar() т.п. - читает значение указанного типа; writeInt(int число), writeFloat(float число),writeChar(char символ),writeChars(String строка)и т.п. - печатает значение указанного типа.

II. Следующие 6 классов используются для работы с текстовыми файлами.

Классы InputStreamReader и OutputStreamWriter (производные от Reader и Writer) - простейшие классы для чтения/записи из/в текстовый файл. Объекты этих классов создаются на основе объектов InputStream и OutputStream. Например,

InputStreamReader myfile = new InputStreamReader( new FileInputStream("data.txt"));

OutputStreamWriter myfile = new OutputStreamWriter( new FileOutputStream("data.txt"));

Оба класса имеют функцию getEncoding для получения текущей кодовой страницы (cp1251 - кодовая страница для русского Windows), а также конструкторы, которые позволяют задать нужную кодовую страницу в качестве второго параметра. Имеют только методы read и write для чтения/записи символа (строки символов).

Классы FileReader и FileWriter(производные от InputStreamWriter и OutputStreamWriter) - отличаются от InputStreamWriter и OutputStreamWriter тем, что объекты этих классов cоздаются на основе объекта File или по имени файла в файловой системе, т.е.

FileReader myfile = new FileReader("data.txt");

FileWriter myfile = new FileWriter("data.txt");

а также не имеют конструктора с заданием кодовой страницы.

Классы BufferedReader и BufferedWriter (производные от Reader и Writer) - используются для буферизованного ввода-вывода данных, поэтому их использование более эффективно, чем, например, FileReader и FileWriter. Создаются на основе объектов Reader и Writer, например,

BufferedReader myfile = new BufferedReader ( new FileReader("data.txt"));

BufferedWriter myfile = new BufferedWriter ( new FileWriter("data.txt"));

В классе BufferedReader определен метод readLine(), который позволяет читать строку символов.

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