- •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
38. Управление приоритетами и ThreadGroup
Java назначает каждому потоку приоритет, который определяет порядок обработки этого потока относительно других потоков. Приоритеты потоков — это целые числа, которые определяют относительный приоритет одного потока над другим. Приоритет потока используется для того, чтобы решить, когда переключаться от одного выполняющегося потока к следующему. Это называется переключением контекста.
Потоку можно назначить приоритет от 1(константа MIN_PRIORITY) до 10(MAX_PRIORITY) с помощью метода setPriority(), получить значение приоритета можно с помощью метода getPriority().
Правила, которые определяют, когда переключение контекста имеет место, следующие:
-Поток может добровольно отказаться от управления ;
-Поток может быть приостановлен более приоритетным потоком.
В большинстве случаев бывает необходимо отслеживать ранее запущенные на выполнение потоки. Использование массива потоков, как в предыдущем примере, не всегда оправданно. Для хранения и обработки потоков в Java существует класс ThreadGroup. Группа, к которой принадлежит создаваемый поток, опять-таки передается конструктору Thread():
ThreadGroup tg = new ThreadGroup("NameThreadGroup");
Thread thread = new Thread(tg, new SecondThread(), "ThreadName");
39. Потоки-демоны
программа будет выполняться до тех пор, пока выполняется хотя бы один запущенный в ней поток; единственным исключением являются потоки-демоны.
Что же это такое? Демон отличается от «простого смертного» потока вызовом метода setDeamon(true), который необходимо сделать до начала работы. Например, так:
FirstThread thread = new FirstThread();
thread.setDeamon(true);
thread.start();
Узнать, является ли поток демоном, можно с помощью метода isDeamon(). Обычно потоки-демоны создаются для обслуживания некритичных задач, так как при завершении работы программа не дожидается их остановки, а прерывает их самостоятельно.
40. Методы synchronized
Основное различие между потоками и процессами состоит в том, что процессы защищены от воздействия друг на друга средствами операционной системы(каждый процесс выполняется в своем адресном пространстве). Использование потоков, лишенных подобной защиты, позволяет быстро запускать новые потоки и способствует их производительности. Однако здесь есть и отрицательный эффект – любой из потоков может получить доступ и даже внести изменения в данные, которые другой поток считает принадлежащими только ему. Решение этой проблемы состоит в синхронизации потоков. Ситуация, когда много потоков, обращающихся к некоторому общему ресурсу, начинают мешать друг другу, очень часта. Например, когда два потока записывают информацию в файл/объект/поток. Синхронизация кода реализуется 2-мя основными способами.
Если критическим участком является метод, то можно просто указать ключевое слово sychronized в объявлении метода, т.е.
synchronized void myMethod ( ) { … }
Эквивалентный код можно представить в виде:
void myMethod ()
{synchronized (this)
{…………….}}
Если нет доступа к классу, в котором объявлен метод, то для его синхронизации можно использовать следующий прием:
synchonized (object)
{ // операторы критического участка, в том числе и вызовы метода}.
Здесь object – ссылка на объект, который нужно синхронизировать, т.е. объект элементом которого является вызываемый метод. При синхронизации одного оператора фигурные скобки можно опускать.
В Java кроме использования блока synchonized разработаны и эффективные средства межпроцессового взаимодействия. Например, метод
public final void wait ( ) throws InterruptedException;
осуществляет перевод вызывающего потока в режим ожидания, пока некоторый другой поток не введет notify().
Существуют и другие варианты метода, например,
public final void wait (long timeout ) throws InterruptedException;
осуществляет задержку на определенное время.
Метод
public final void notify();
«пробуждает» первый поток, который вызвал ожидание- wait ( ); на том же объекте.