Кроме того, определен метод wait() с параметром, который задает период тайм-аута, по истечении которого поток сам попытается возобновить свою работу. Но начать ему придется все равно с повторного получения блокировки.
Заключение
В этой лекции были рассмотрены принципы построения многопоточного приложения. В начале разбирались достоинства и недостатки такой архитектуры – как правило ОС не выделяет отдельный процессор под каждый процесс, а значит применяется процедура time slicing. Было выделено три признака, указывающие на целесообразность запуска нескольких потоков в рамках программы.
Основу работы с потоками в Java составляют интерфейс Runnable и класс Thread. С их помощью можно запускать и останавливать потоки, менять их свойства, среди которых основные: приоритет и свойство daemon. Главная проблема, возникающая в таких программах - одновременный доступ нескольких потоков к одним и тем же данным, в первую очередь -– к полям объектов. Для понимания, как в Java решается эта задача, был сделан краткий обзор по организации памяти в JVM, работы с переменными и блокировками. Блокировки, несмотря на название, сами по себе не ограничивают доступ к переменной. Программист использует их через ключевое слово synchronized, которое может быть указано в сигнатуре метода или в начале блока. В результате выполнение не будет продолжено, пока блокировка не освободится.
Новый механизм порождает новую проблему - взаимные блокировки (deadlock), к которой программист всегда должен быть готов, тем более, что Java не имеет встроенных средств для определения такой ситуации. В лекции разбирался пример, как организовать работу программы без "зависания" ожидающих потоков.
В завершение рассматривались специализированные методы базового класса Object, которые также позволяют управлять последовательностью работы потоков.
13. Лекция: Пакет java.lang
В этой лекции рассматривается основная библиотека Java – java.lang. В ней содержатся классы Object и Class, классы-обертки для примитивных типов, класс Math, классы для работы со строками String и StringBuffer, системные классы System, Runtime и другие. В этом же пакете находятся типы, уже рассматривавшиеся ранее,– для работы с исключительными ситуациями и потоками исполнения.
Введение
В состав пакета java.lang входят классы, составляющие основу для всех других, и поэтому он является наиболее важным из всех, входящих в Java API. Поскольку без него не может обойтись ни один класс, каждый модуль компиляции содержит неявное импортирование этого пакета ( import java.lang.*; ).
Перечислим классы, составляющие основу пакета.
Object – является корневым в иерархии классов.
Class – экземпляры этого класса являются описаниями объектных типов в памяти JVM.
String – представляет собой символьную строку, содержит средства работы с нею.
StringBuffer – используется для работы (создания) строк.
Number – абстрактный класс, являющийся суперклассом для классов-объектных оберток числовых примитивных типов Java.
Character – объектная обертка для типа char.
Boolean – объектная обертка для типа boolean.
Math – реализует набор базовых математических функций.
Throwable – базовый класс для объектов, представляющих исключения. Любое исключение, которое может быть брошено и, соответственно, перехвачено блоком catch, должно быть унаследовано от Throwable.
Thread – позволяет запускать и работать с потоками выполнения в Java. Runnable – может использоваться в сочетании с классом Thread для описания потоков выполнения.
ThreadGroup – позволяет объединять потоки в группу и производить действия сразу над всеми потоками в ней. Существуют ограничения по безопасности на манипуляции с потоками из других групп.
System – содержит полезные поля и методы для работы системного уровня.
Runtime – позволяет приложению взаимодействовать с окружением, в котором оно запущено.
Process – представляет интерфейс к внешней программе, запущенной при помощи Runtime.
ClassLoader – отвечает за загрузку описания классов в память JVM.
SecurityManager – для обеспечения безопасности накладывает ограничения на данную среду выполнения программ.
Compiler – используется для поддержки Just-in-Time компиляторов.
Интерфейсы:
Cloneable – должен быть реализован объектами, которые планируется клонировать с помощью средств JVM;
Comparable – позволяет упорядочивать (сортировать, сравнивать) объекты каждого класса, реализующего этот интерфейс.
Object
Класс Object является базовым для всех остальных классов. Он определяет методы, которые поддерживаются любым классом в Java.
Читать дальше