Синхронизация потоков
1 Когда двум или более потоком требуется доступ к совместно используемым ресурсам, то нужен способ доступа к ресурсам не более 1 потока в каждый момент времени. В Java это достигается при помощи процесса синхронизации. Решается данная проблема при помощи концепции монитора, который представляется объектом, используемым как взаимоисключающая блокировка, лишь один поток может владеть монитором в данное время. все другие потоки, которые требуют доступ в монитор будут приостановлены до его освобождения. Поток, который владеет монитором может повторно войти в монитор, если это необходимо. Для примера синхронизации потока разберем следующую программу. необходимо вывести на экран с помощью потоков следующую надпись (три слова, располож в кв. скобках).
[fgdshg]
[sgdhs]
[gdg]
Будут использоваться 3 класса.
1 класс - содержит метод, вызывающий первую строку.
class CallMe {
void call (string msg){
Systemout… (“[“+msg
try {
второй класс создает новый поток, который вызывает метод Run объекта
class Caller …
Runnable {
string msg
Callme target
третий класс будет создавать экземпляр класса CallMe и три экземпляра класса Coller каждый с уникальной строкой сообщения. Класс Coller будет получать один и тот же экземпляр класса CallMe.
class
public
….
После запуска данной программы результат работы мы видим в следующем варианте:
[Me[…[Java]
]
]
Данная ситуация происходит к непоследовательному доступу потокам к методу Call. Необходимо органичения доступа к методу лишь одним потоком. Для этого используется модификатор synchronized
Т.е. метод Call должен описываться следующим образом:
synchronized void Call (далее как в примере)
Это один из способов решения вопроса синхронизации.
Однако бывает необходимость в синхронизации метода класса, который не был разработан для многопоточного программирования, соответственно не имеет в своей структуры параллельно выполняющихся методов. synchronized (объект) {операторы класса, работу которых необходимо синхронизировать, при этом объект - ссылка на синхронизируемый объект}. Исходя из этой формы записи пример можно переписать следующим образом:
При этом следует помнить следующее: при многопоточном программировании в Java создавать потоки и их использовать следует с осторожностью, т.к. выполняющая система Java может снизить производительность из-за большого числа наличия потоков. связанно это с тем, что большая часть времени работы многопоточных приложений уйдет на изменение контекста приложение, а не на выполнение отдельных потоков и программ.
Сетевые приложение Java. Пакеты Java.Io Java.Net
Для реализации любого сетевого приложения на Java используется пакет Java.net, а точнее его основные классы URL и URLConnection.Класс URL - простой сетевой интерфейс и загрузка объекта, на который ссылается URL сводится к вызову единственного метода. При использовании этого класса можно открыть поток для чтения из объекта и поток для записи в объект. При этом объект класса URL может быть задан в виде единой строки путем указания адреса, так и раздельного указания порта, узла и протокола. Для работы с относительными URL класс URL работает совместно с классом string и у обоих классов есть соответствующие конструкторы. Класс URLConnection более сложен и содержит дополнит. методы для работы с объектамиURL на более высоком уровне. Т.е. объект URLConnection можно получить из заданного объекта URL. Класс URLConnection использует, если необходимо осуществлять строгий контроль сетевого приложения и действиями пользователя. Для этого выделяют 3 основных метода этого класса:
setDoInput
setDOOutput
позволяют орперделить для чего будет использован метод URLConnection (ввод/вывод). По умолчанию разрешен лишь ввод данных.
setAllowUserInterection - указывает разрешено ли во время передачи данных взаимодействие с пользователем, например, ввод пароля, чтение начальных данных из потока и т.д. по умолчанию взаимодействие разрешено. Если URL-протокол поддерживает операции чтения и записи, то методы getInputStream () getOutputStream возвращают потоки соотв. потоки ввода и вывода данных, которые работают с объектами URL и URLСonnection/
