- •30.Общее представление о потоках ввода/вывода
- •31.Байтовые и символьные потоки
- •32. Определение файла. Тестирование проверка объектов File
- •34. Сериализация
- •35. Обработка исключений в Java
- •36. Многопоточное программирование
- •37. Создание потока и его жизненный цикл
- •38. Управление приоритетами и ThreadGroup
- •39. Потоки-демоны
- •40. Методы synchronized
- •41. Коллекции
- •42. Списки
- •43. 43. Множества
- •44. Карты отображений
- •45. Обзор сокетов
- •49. Дейтаграммы
- •46. Сетевые классы и интерфейсы 47. Производственные методы 48. Сокеты tcp/ip клиентов и серверов
- •50. Основы оконной графики 51. Иерархия классов awt
- •Класс Applet
- •52. Свойства класса Component
- •53. Класс Container
- •54. Наследники класса Component
- •55. Классы Choice и List
- •56. Классы TextComponent, TextField, TextArea
- •57. Наследники Container
- •58. Swing-технология
- •59. Обработка событий в Java
- •60. Классы-адаптеры
- •61. Понятие и терминология jdbc 62. Связь и различия jdbc и odbc
- •63. Драйвера, соединения и запросы
- •64. DriverManager
- •65. Создание соединения с источником данных
- •66. Интерфейсы Statement, PreparedStatement и CallableStatement
- •69. Использование потоков в апплетах
- •70. Основы xml
- •71. Xml. Схема dtd. Элемент Schema схемы xml
- •72. Ссылки xml
- •74. Язык xLink (Атрибуты связующих элементов xLink, возможные значения атрибута xlink:show, возможные значения атрибута xlink:actuate)
- •75. Язык xPointer (Синтаксис xPointer, элементы абсолютного обнаружения xPointer, выражения отношений, фильтры атрибутов и их значений)
- •76. Объектная модель документа xml – dom
- •77. Simple api для xml (sax)
- •78. Язык преобразований xslt (Операционный xslt, процесс преобразования xsl, использование xslt, преобразования xml в html)
- •80. Сервлеты: структура, назначение и преимущества
- •81. Жизненный цикл сервлета
- •83. Пакеты javax.Servlet и javax.Servlet.Http
- •84. Технология rmi. Сравнение распределенных и нераспределенных приложений
- •85. Архитектура rmi
36. Многопоточное программирование
В отличие от многозадачности, где задачи используют собственное адресное пространство, потоки используют одно и то же адресное пространство и разделяют процессорное время.
Один из потоков – «главный» начинает выполняться первым при запуске Java-программы. От него порождаются дочерние потоки. Главный поток является последним выполняющимся потоком. Программа завершается, когда главный поток останавливается.
Поток может быть создан на основе базового класса Thread или реализации интерфейса Runnable. Класс Thread инкапсулирует ряд методов, которые помогают управлять потоками.
В многопоточном режиме блокировка одного потока не приводит к остановке всей программы, например, в ожидании занятого ресурса, а вызывает передачу управления потоку, который может выполняться. Java обеспечивает встроенную поддержку для многопоточного программирования. В Java назначается приоритет, определяющий порядок обработки одного потока относительно другого, т.е. порядок переключения процессора от выполняющегося потока к следующему (переключение контекста). Абсолютное значение приоритета потока само по себе не имеет значения
В отличие от большинства других машинных языков, Java обеспечивает встроенную поддержку для многопоточного программирования. Многопоточная программа содержит две и более частей, которые могут выполняться одновременно, конкурируя друг с другом. Каждая часть такой программы называется потоком, а каждый поток определяет отдельный путь выполнения (в последовательности операторов программы).
Потоки существуют в нескольких состояниях. Поток может быть в состоянии выполнения. Может находиться в состоянии готовности к выполнению, как только он получит время CPU. Выполняющийся поток может быть приостановлен, что временно притормаживает его действие. Затем приостановленный поток может быть продолжен (возобновлен) с того места, где он был остановлен. Поток может быть блокирован в ожидании ресурса. В любой момент выполнение потока может быть завершено, что немедленно останавливает его выполнение. После завершения поток не может быть продолжен.
Java назначает каждому потоку приоритет, который определяет порядок обработки этого потока относительно других потоков. Приоритеты потоков — это целые числа, которые определяют относительный приоритет одного потока над другим. Приоритет потока используется для того, чтобы решить, когда переключаться от одного выполняющегося потока к следующему. Это называется переключением контекста.
Многопоточная система Java построена на классе Thread, его методах и связанном с ним интерфейсе Runnable. Thread инкапсулирует поток выполнения. Так как вы не можете непосредственно обращаться к внутреннему состоянию потока выполнения, то будете иметь с ним дело через его полномочного представителя — экземпляр (объект) класса Thread, который его породил. Чтобы создать новый поток, ваша программа должна будет или расширять Класс Thread или реализовывать интерфейс Runnable.
37. Создание потока и его жизненный цикл
Программа всегда имеет один поток, который создается при выполнении программы. В программе этот поток запускается в начале метода main. В апплете браузер является основным потоком. Программа создает поток в дополнение к потоку выполнения, который его создает. Для создания дополнительного потока используется объект класса Thread. Каждый дополнительный поток, который задает программа, представлен объектом класса Thread или подкласса Thread. Если программа имеет три дополнительных потока, то необходимо создать три таких объекта.
Для начала выполнения потока вызывается метод start() объекта Thread. Код, который выполняется в новом потоке, всегда является методом с именем run (), который является открытым (public), не имеет аргументов и не возвращает значение. Потоки, отличные от основного потока программы, всегда запускаются методом run() объекта, который представляет поток.
При реализации интерфейса Runnable необходимо определить его единственный метод run().
Программа, которая создает три потока, схематически проиллюстрирована на рис. 6.1. Приведенная иллюстрация показывает метод main(), создающий три потока. Однако не обязательно так должно быть всегда. Любой поток может создавать дополнительные потоки.
Рис. 6.1. Консольная программа, которая порождает три потока