Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Voprosy_-_Razrabotka_web-prilozheny_Java(1).doc
Скачиваний:
46
Добавлен:
25.03.2015
Размер:
1.23 Mб
Скачать
  1. Управление приоритетами и группы потоков. Управление потоками. Потоки-демоны.

Потоку можно назначить приоритет от 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(), не обращая внимания на то, что поток-демон еще работает. Если уменьшать время задержки потока- демона, то он может успеть завершить свое выполнение до окончания работы ос- новного потока.

  1. Методы 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();

  1. Состояния потока.

В классе Thread объявлено внутреннее перечисление State, простейшее применение элементов которого призвано помочь в отслеживании состояний потока в процессе функционирования приложения и, как следствие, в улучшении управления им

NEW, RUNNABLE, TIMED_WAITING, TERMINATED, BLOCKED, WAITING

  1. Сокетные соединения по протоколу 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 для того, чтобы программа могла трактовать поток как выходные файлы.

  1. Многопоточность.

Сервер должен поддерживать многопоточность, иначе он будет не в состоя- нии обрабатывать несколько соединений одновременно. В этом случае сервер содержит цикл, ожидающий нового клиентского соединения. Каждый раз, когда клиент просит соединения, сервер создает новый поток.

  1. Датаграммы и протокол UDP.

UDP (User Datagram Protocol) не устанавливает виртуального соединения и не гарантирует доставку данных. Отправитель просто посылает пакеты по указанно- му адресу; если отосланная информация была повреждена или вообще не дошла, отправитель об этом даже не узнает. Однако достоинством UDP является высокая скорость передачи данных. Данный протокол часто используется при трансляции аудио- и видеосигналов, где потеря небольшого количества данных не может привести к серьезным искажениям всей информации. По протоколу UDP данные передаются пакетами. Пакетом в этом случае UDP является объект класса DatagramPacket. Этот класс содержит в себе передава- емые данные, представленные в виде массива байт.

Класс DatagramSocket может выступать в роли клиента и сервера, то есть он способен получать и отправлять пакеты. Отправить пакет можно с помощью метода send(DatagramPacket pac), для получения пакета используется ме- тод receive(DatagramPacket pac).

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