- •Методические указания по выполнению срс Программирование на языке java
- •Введение
- •1. Java - объектно-ориентированный язык программирования
- •1.1. Базовые типы данных
- •1.2. Операции (operators) в языке Java
- •1.2.1. Операции сравнения
- •1.2.2. Операции инкремента, декремента
- •1.3. Литералы (константы)
- •1.5. Массивы в Java
- •1.4. Операторы
- •1.6. Комментарии
- •1.7. Первая программа на языке Java
- •1.8. Цель, требования и рекомендации к выполнению задания
- •1.9. Задания
- •2. Абстрактные классы и Интерфейсы
- •2.1. Абстрактные классы
- •2.2. Интерфейсы
- •2.3. Цель, требования и рекомендации к выполнению задания
- •2.4. Задания
- •2.5. Пример выполнения задания.
- •3. Знакомство с библиотекой Swing
- •3.1. Основы оконной графики
- •3.2. Модель событий в Swing
- •3.3. Цель, требования и рекомендации к выполнению задания
- •3.4. Задания
- •3.5. Пример выполнения задания.
- •4. Апплеты
- •4.1. Проблема безопасности
- •4.2. Создание апплетов
- •4.3. Апплеты и приложения
- •4.4. Цель, требования и рекомендации к выполнению задания
- •4.5. Задания
- •4.6. Пример выполнения задания.
- •4.6.1. Запуск апплетов
- •4.6.2. Пример выполнения задания 2
- •5. Множественные нити выполнения (Multiple threads).
- •5.1. Реализация многопоточности в Java
- •5.1.1. Методы класса Thread
- •5.1.2. Реализация интерфейса Runnable
- •5.3. Завершение и останов нити
- •5.4. Приоритеты нитей
- •5.5. Средства синхронизации нитей в Java
- •5.6. Применение многопоточности для анимации
- •5.7. Цель, требования и рекомендации к выполнению задания
- •5.8. Задания
- •5.9. Пример выполнения задания.
- •Дополнительная информация и список литературы
- •Оглавление
5.1.1. Методы класса Thread
В классе Thread определены три поля, несколько конструкторов и большое количество методов, предназначенных для работы с потоками. Ниже мы привели краткое описание полей, конструкторов и методов.
С помощью конструкторов вы можете создавать потоки различными способами, указывая при необходимости для них имя и группу. Имя предназначено для идентификации потока и является необязательным атрибутом. Что же касается групп, то они предназначены для организации защиты потоков друг от друга в рамках одного приложения.
Методы класса Thread предоставляют все необходимые возможности для управления потоками, в том числе для их синхронизации.
5.1.2. Реализация интерфейса Runnable
Описанный выше способ создания потоков как объектов класса Thread или унаследованных от него классов кажется достаточно естественным. Однако этот способ не единственный. Если вам нужно создать только один поток, работающую одновременно с кодом аплета, проще выбрать второй способ с использованием интерфейса Runnable.
Идея заключается в том, что основной класс аплета, который является дочерним по отношению к классу Applet, дополнительно реализует интерфейс Runnable, как это показано ниже:
public class MultiTask extends
Applet implements Runnable
{
Thread m_MultiTask = null;
. . .
public void run()
{
. . .
}
public void start()
{
if (m_MultiTask == null)
{
m_MultiTask = new Thread(this);
m_MultiTask.start();
}
}
public void stop()
{
if (m_MultiTask != null)
{
m_MultiTask.stop();
m_MultiTask = null;
}
}
}
Внутри класса необходимо определить метод run, который будет выполняться в рамках отдельного потока. При этом можно считать, что код апплета и код метода run работают одновременно как разные потоки.
Для создания потока используется оператор new. Поток создается как объект класса Thread, причем конструктору передается ссылка на класс апплета:
m_MultiTask = new Thread(this);
При этом, когда поток запустится, управление получит метод run, определенный в классе апплета. Как запустить поток? Запуск выполняется, как и раньше, методом start. Обычно поток запускается из метода start апплета, когда пользователь отображает страницу сервера Web, содержащую апплет. Остановка потока выполняется методом stop.
5.3. Завершение и останов нити
Как уже указывалось, нормальное завершение нити происходит при выходе из метода run. Кроме того, иногда в приложении требуется выполнить временный останов нити, с тем, чтобы потом возобновить ее работу.
В классе Thread есть методы stop (завершить), suspend (приостановить) и resume (возобновить), но все они объявлены deprecated (устаревшими) и их использование не рекомендовано. О причинах можно почитать подробнее в документации по Java и их здесь рассматривать не будем.
Как же поступить в случае, если нужно приостановить выполнение процесса? Для этого нужно не останавливать процесс, а обеспечить такой алгоритм, при котором он "работает в холостую".
5.4. Приоритеты нитей
Если процесс создал несколько потоков, то все они выполняются параллельно, причем время центрального процессора (или нескольких центральных процессоров в мультипроцессорных системах) распределяется между этими потоками.
Распределением времени центрального процессора занимается специальный модуль операционной системы - планировщик. Планировщик по очереди передает управление отдельным потокам, так что даже в однопроцессорной системе создается полная иллюзия параллельной работы запущенных потоков.
Распределение времени выполняется по прерываниям системного таймера. Поэтому каждому потоку дается определенный интервал времени, в течении которого он находится в активном состоянии.
Заметим, что распределение времени выполняется для потоков, а не для процессов. Потоки, созданные разными процессами, конкурируют между собой за получение процессорного времени.
Для оптимизации параллельной работы нитей в Java имеется возможность устанавливать приоритеты нитей. Нити с большим приоритетом имеют преимущество в получении времени процессора перед нитями с более низким приоритетом.
Работа с приоритетами обеспечивается следующими методами класса Thread:
public final void setPriority(int newPriority)
Устанавливает приоритет нити.
public final int getPriority()
Позволяет узнать приоритет нити.
Значение параметра в методе setPriority не может произвольным. Оно должно находиться в пределах от MIN_PRIORITY до MAX_PRIORITY. При своем создании нить имеет приоритет NORM_PRIORITY.
