Когда поток заблокирован или находится в состоянии ожидания, он временно не активен. Он не выполняет никакого кода и потребляет минимум ресурсов. На планировщике потоков лежит обязанность повторно активизировать его. Подробности зависят от того, как было достигнуто неактивное состояние. Читать
Архив рубрики Java для опытных
Обработчик неперехваченных исключений Java
Метод run() потока не может генерировать никаких контролируемых исключений, но может быть прерван неконтролируемым исключением. В этом случае поток уничтожается.
Однако нет конструкции catch, куда может распространиться исключение. Вместо этого непосредственно перед смертью потока исключение передается обработчику неперехваченных исключений. Читать
Web-службы и JAX-WS в Java
За последние годы популярной технологии для вызовов удаленных методов стали Web-службы(Web-services). С технической точки зрения каждая Web-служба состоит из двух компонентов:
- непосредственно самой службы, доступ которой может получаться с помощью транспортного протокола SOAP;
- описания службы в формате WSDL. Читать
Использование локального буфера обмена для передачи ссылок на объекты Java
Иногда может возникать необходимость в копировании и вставке данных такого типа, которые не поддерживаются системным буфером обмена, то есть не является сериализируемым. Для передачи ссылки на произвольный объект Java в пределах одной и той же виртуальной машины (JVM) применяется тип MIME:
1 |
application/x-java-jvm-local-objectref;class=имя_класса |
Для этого типа требуется определять объект-оболочку Transferable. Необходимый для этого процесс полостью аналогичен процессу определения объекта-оболочки SerialTransferable. Читать
Прерываемые сокеты Java
При подключении с помощью сокета текущий поток блокируется до тех пор, пока соединение не будет установлено, или до истечения времени тайм-аута. Аналогично, если вы пытаетесь передать или прочитать данные посредством сокета, поток приостановит выполнение до успешного завершения операции или до окончания времени тайм-аута.
В реальных приложениях желательно предоставить пользователям возможность прервать слишком затянувшийся процесс установления соединения с помощью сокета. Однако если поток блокирован, поскольку не получает ответа от сокета, вы не можете разблокировать его, вызвав метод interrupt(). Читать
Одностороннее закрытие сокета Java
Одностороннее закрытие(half-close) обеспечивает возможность одной стороне закрыть соединение с сокетом, прекратив отправку своих данных, но при этом получая данные с другой стороны.
Вот типичная ситуация. Предположим, что вы отправляете данные на сервер, но не знаете, какой объем данных необходимо передать. Если вы имеете дело с файлом, то, закрыв его, вы тем самым определяете конец данных. Закрыв же сокет, вы немедленно разорвете соединение с сервером. Читать
Чтение и запись больших объектов Java
В дополнение к числам, строкам и датам, многие базы данных могут сохранять большие объекты(large object - LOB), к числу которых относятся изображения и другие данные. В языке SQL существует понятие больших двоичных объектов(binary large object - BLOB) и больших символьных объектов(character large object - CLOB).
Чтобы прочитать LOB, нужно сначала выполнить оператор SQL, а затем вызвать метод getBlob или getClob в ResultSet. В результате вы получите объект типа Blob или Clob. Чтобы получить двоичные данные из Blob, вызовите метод getBytes или getInputStream. Читать
Слабые хеш-карты Java
Класс WeakHashMap был спроектирован для решения одной интересной проблемы. Что случится со значением, чей ключ более не используется нигде в вашей прогармме? Предположим, что последняя ссылка на ключ исчезла. Значит, не остается никакого способа сослаться на объект-значение. Но поскольку ни одна часть программы не содержит обращений к данному ключу, то и соответствующая пара "ключ/значение" не может быть удалена из карты.
Почему бы сборщику мусора не удалить ее? Разве это не его работа - удалять неиспользуемые объекты? Читать
Вызов унаследованного кода Java
До появления Java SE 5.0 был написан огромный объем кода Java. Если бы обобщенные классы не могли взаимодействовать с этим кодом, они не получили бы широкого распространения. К счастью, достаточно просто использовать обобщенные классы вместе с их "сырыми" эквивалентами из унаследованного API.
Рассмотрим конкретный пример. Чтобы установить метки JSlider, вы используете метод:
1 |
void setLabelTable(Directory table) |
Чтение и запись файлов, содержащих несколько изображений Java
Некоторые файлы, например анимационные GIF-файлы, могут содержать несколько изображений. Однако метод read() класса ImageIO позволяет считывать только одно из них. Для чтения нескольких изображений нужно преобразовать источник входных данных(например, входной поток файла) в объект ImageInputStream:
1 2 |
InputStream in = ...; ImageInputStream imageIn = ImageIO.createImageInputStream(in); |
Затем следует соединить этот объект с программой чтения: Читать