- •Вопросы по java
- •Базовые типы данных и литералы. Операторы. Классы-оболочки.Операторы управления.
- •М ассивы.
- •Статические методы и поля. Модификатор native. Модификатор synchronized. Логические блоки.
- •Параметризованные классы. Параметризованные методы. Методы с переменным числом параметров.
- •Наследование. Использование final.
- •Использование super и this.
- •Переопределение методов и полиморфизм. Полиморфизм и расширяемость.
- •Клонирование объектов. “Сборка мусора” и освобождение ресурсов.
- •Интерфейсы.
- •Статический импорт.
- •Внутренние (inner) классы. Вложенные (nested) классы. Анонимные (anonymous).
- •Класс String.
- •Классы StringBuilder и StringBuffer.
- •Регулярные выражения.
- •Интернационализация текста.
- •Иерархия и способы обработки. Оператор throw.Ключевое слово finally.
- •Собственные исключения. Наследование и исключения. Отладочный механизм assertion.
- •Класс File. Байтовые и символьные потоки ввода/вывода. Предопределенные потоки.
- •Класс Scanner.
- •Коллекции. Общие определения.
- •Списки.
- •Множества.
- •Карты отображений.
- •Управление приоритетами и группы потоков. Управление потоками. Потоки-демоны.
- •Методы synchronized. Инструкция synchronized.
- •Интерфейс ServletContext. Интерфейс ServletConfig
- •Интерфейсы ServletRequest и HttpServletRequest. Интерфейсы ServletResponse и HttpServletResponse.
- •Обработка запроса. Многопоточность.
- •Стандартные элементы action. Jsp-документ.
- •Технология взаимодействия jsp и сервлета.
-
Управление приоритетами и группы потоков. Управление потоками. Потоки-демоны.
Потоку можно назначить приоритет от 1 (константа MIN_PRIORITY) до 10 (MAX_PRIORITY) с помощью метода setPriority(int prior). Получить значение приоритета можно с помощью метода getPriority().
Поток с более высоким приоритетом в данном случае, как правило, монопо- лизирует вывод на консоль. Потоки объединяются в группы потоков. После создания потока нельзя изме- нить его принадлежность к группе. ThreadGroup tg = new ThreadGroup("Группа потоков 1"); Thread t0 = new Thread(tg, "поток 0"); Все потоки, объединенные группой, имеют одинаковый приоритет. Чтобы определить, к какой группе относится поток, следует вызвать метод getThreadGroup(). Если поток до включения в группу имел приоритет выше приоритета группы потоков, то после включения значение его приритета станет равным приоритету группы. Поток же со значением приоритета более низким, чем приоритет группы после включения в оную, значения своего приоритета не изменит.
Приостановить (задержать) выполнение потока можно с помощью метода sleep(время задержки) класса Thread. Менее надежный альтернативный способ состоит в вызове метода yield(), который может сделать некоторую паузу и позволяет другим потокам начать выполнение своей задачи. Метод join() блокирует работу потока, в котором он вызван, до тех пор, пока не будет закончено выполнение вызывающего метод потока.
Потоки-демоны работают в фоновом режиме вместе с программой, но не яв- ляются неотъемлемой частью программы. Если какой-либо процесс может вы- полняться на фоне работы основных потоков выполнения и его деятельность за-
ключается в обслуживании основных потоков приложения, то такой процесс мо- жет быть запущен как поток-демон. С помощью метода setDaemon(boolean value), вызванного вновь созданным потоком до его запуска, можно определить поток-демон. Метод boolean isDaemon() позволяет определить, является ли указанный поток демоном или нет.
Поток-демон (из-за вызова метода sleep(10000)) не успел завершить вы- полнение своего кода до завершения основного потока приложения, связанного с методом main(). Базовое свойство потоков-демонов заключается в возможности основного потока приложения завершить выполнение потока-демона (в отличие от обычных потоков) с окончанием кода метода main(), не обращая внимания на то, что поток-демон еще работает. Если уменьшать время задержки потока- демона, то он может успеть завершить свое выполнение до окончания работы ос- новного потока.
-
Методы synchronized. Инструкция synchronized.
Очень часто возникает ситуация, когда несколько потоков, обращающихся к некоторому общему ресурсу, начинают мешать друг другу; более того, они могут повредить этот общий ресурс. Например, когда два потока записывают информа- цию в файл/объект/поток. Для предотвращения такой ситуации может использо- ваться ключевое слово synchronized. Синхронизации не требуют только ато- марные процессы по записи/чтению, не превышающие по объему 32 бит.
public synchronized void writing(String str, int i)
Синхронизировать объект можно не только при помощи методов с соответству- ющим модификатором, но и при помощи синхронизированного блока кода. В этом случае происходит блокировка объекта, указанного в инструкции synchronized, и он становится недоступным для других синхронизированных методов и блоков. Обычные методы на синхронизацию внимания не обращают, поэтому ответствен- ность за грамотную блокировку объектов ложится на программиста.
final StringBuffer s = new StringBuffer();
new Thread() {
public void run() {
int i = 0;
synchronized (s) {
while (i++ < 3) {
s.append("A");
try {
sleep(100);
} catch (InterruptedException e) { System.err.print(e); } System.out.println(s);
} }//конец synchronized } }.start();
-
Состояния потока.
В классе Thread объявлено внутреннее перечисление State, простейшее применение элементов которого призвано помочь в отслеживании состояний потока в процессе функционирования приложения и, как следствие, в улучшении управления им
NEW, RUNNABLE, TIMED_WAITING, TERMINATED, BLOCKED, WAITING
-
Сокетные соединения по протоколу TCP/IP.
Сокеты (сетевые разъёмы) это логическое понятие, соответствующее разъ- ёмам, к которым подключены сетевые компьютеры и через которые осуществляя- ется двунаправленная поточная передача данных между компьютерами. Сокет определяется номером порта и IP-адресом. При этом IP-адрес используется для идентификации компьютера, номер порта – для идентификации процесса, рабо- тающего на компьютере. Когда одно приложение знает сокет другого, создается сокетное протоколо-ориентированное соединение по протоколу TCP/IP. Клиент пытается соединиться с сервером, инициализируя сокетное соединение. Сервер прослушивает сообщение и ждет, пока клиент не свяжется с ним. Первое сообще- ние, посылаемое клиентом на сервер, содержит сокет клиента. Сервер, в свою очередь, создает сокет, который будет использоваться для связи с клиентом, и посылает его клиенту с первым сообщением. После этого устанавливается ком- муникационное соединение.
Сокетное соединение с сервером создается клиентом с помощью объекта класса Socket. При этом указывается IP-адрес сервера и номер порта. Если ука- зано символьное имя домена, то Java преобразует его с помощью DNS-сервера к IP-адресу.
Сервер ожидает сообщения клиента и должен быть заранее запущен с указа- нием определенного порта. Объект класса ServerSocket создается с указанием конструктору номера порта и ожидает сообщения клиента с помощью метода accept()класса ServerSocket, который возвращает сокет клиента: ServerSocket server = new ServerSocket(8030); Socket socket = server.accept();
Таким образом, для установки необходимо установить IP-адрес и номер порта сервера, IP-адрес и номер порта клиента. Обычно порт клиента и сервера устанав- ливаются одинаковыми. Клиент и сервер после установления сокетного соедине- ния могут получать данные из потока ввода и записывать данные в поток вывода с помощью методов getInputStrеam() и getOutputStrеam() или к PrintStream для того, чтобы программа могла трактовать поток как выходные файлы.
-
Многопоточность.
Сервер должен поддерживать многопоточность, иначе он будет не в состоя- нии обрабатывать несколько соединений одновременно. В этом случае сервер содержит цикл, ожидающий нового клиентского соединения. Каждый раз, когда клиент просит соединения, сервер создает новый поток.
-
Датаграммы и протокол UDP.
UDP (User Datagram Protocol) не устанавливает виртуального соединения и не гарантирует доставку данных. Отправитель просто посылает пакеты по указанно- му адресу; если отосланная информация была повреждена или вообще не дошла, отправитель об этом даже не узнает. Однако достоинством UDP является высокая скорость передачи данных. Данный протокол часто используется при трансляции аудио- и видеосигналов, где потеря небольшого количества данных не может привести к серьезным искажениям всей информации. По протоколу UDP данные передаются пакетами. Пакетом в этом случае UDP является объект класса DatagramPacket. Этот класс содержит в себе передава- емые данные, представленные в виде массива байт.
Класс DatagramSocket может выступать в роли клиента и сервера, то есть он способен получать и отправлять пакеты. Отправить пакет можно с помощью метода send(DatagramPacket pac), для получения пакета используется ме- тод receive(DatagramPacket pac).