Параллельные потоки в языке Java.
На современном этапе развития информационных технологий, большую роль играет параллельная обработка данных. В настоящее время все операционные системы имеют предоставляют возможность параллельного решения задач. В некоторых операционных системах это реализовано на программном уровне, в некоторых на аппаратном. Поскольку виртуальная машина Java является транслятором, решение данной проблемы организовано на программном уровне.
Работа приложения или аплита обслуживается отдельным потоком, т.е. при запуске любой программы разработанной на языке Java автоматически запускается один параллельный поток, а при запуске приложения также запускается и процесс. Поток, созданный при запуске программы является корневым. Кроме того любая программа может иметь дочерние параллельные потоки, т.е. внутри каждой программы можно организовать свою собственную обработку данных. Обычно параллельные потоки при программировании на языке Java используются для независимой обработки данных от взаимодействия приложений или аплита с пользователем. Общая структурная схема работы приложения, не имеющего встроенных параллельных потоков разработанного на языке Java приведена на рисунке 5.
Рис. 5 Схема работы программы не имеющей внутренних параллельных потоков
Из рисунка 5 видно, что время процессора делиться на части между отдельными программами. Процентное отношение времени выделенного отдельному процессу называется его приоритетом. После выполнении части кода, программа отдает управление диспетчеру задач для обслуживания других процессов. Завершение потока может произойти при выполнении одного из условий:
ü Выполнены все инструкции программы;
ü Требуется принудительно уничтожить поток.
Следует помнить, что внешнее воздействие на поток, возможно только в период, когда последний находиться в состоянии ожидания. Также следует помнить, что при принудительном уничтожении потока, память выделенная последнему не возвращается системе. Поэтому к принудительному уничтожению потока следует прибегать только в случае зависания приложения.
При разработке многопоточных приложений, в качестве диспетчера задач для дочерних потоков выступает корневой поток, а время, выделенное процессу, делиться между корневым и дочерними потоками, согласно относительного приоритета. Язык Java, в отличие от языков программирования код которых представляет собой набор инструкций процессора не имеет возможности менять абсолютный приоритет процесса в системе. Общая структурная схема многопоточных приложений может иметь вид, приведенный на рисунке 6.
Рис.6 Схема работы программы, имеющей внутренние параллельные потоки
На рис. 6 под диспетчеризацией дочерних процессов понимается создание, уничтожение и выполнение инструкций дочерних потоков.
Для разработки многопоточных приложений и аплитов в языке Java имеется класс Thread. Общая структура класса выполняющего инструкции в параллельном режиме имеет следующий вид:
// Описываем название пакета, которому принадлежит класс
package имя пакета;
// Подключаем библиотеку обработки исключительных ситуаций потока
import java.lang.InterruptedException;
// Описание класса
public class имя класса extends Thread {
//Описание класса состояния потока
private boolean FRuning=false;
//Описание внутренних переменных класса
//Описание конструктора класса
public имя класса () {
// Установка относительного приоритета потока
this.setPriority(4);
}
// Функция остановки потока. Для остановки потока
// будем использовать изменение флага состояния потока.
public void Stop()
{
if(!FRuning)return;
FRuning=false;
}
// В качестве примера использования обработки исключительных ситуаций
// параллельных потоков рассмотрим функцию задержки потока.
public boolean Sleep(long timeout)
{
try
{
// Вызов стандартной функции задержки времени
sleep(timeout);
return true;
}
catch(InterruptedException e)
{
// В случае ошибки выводим на экран сообщение и останавливаем поток
System.out.println(e.getMessage());
FRuning=false;
return false;
}
}
// Запуск потока
public void Start()
{
FRuning=true;
this.start();
}
// Функция обработки данных в параллельном режиме
public void run()
{
while(FRuning && условие окончания работы)
{
}
if(FRuning)FRuning=false;
}
// И в конце функция определения состояния потока
public Boolean is_runing()
{
return FRuning;
}
}
Дата добавления: 2016-01-03; просмотров: 908;