Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный практикум_ОООП_для ДО (1).doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
755 Кб
Скачать
☆

Организация потоков

Диапазон приоритетов потоков определяется: MIN_PRIORITY – 1 и MAX_PRIORITY – 10. По умолчанию приоритет потока равен 5. При запуске main-функции её приоритет по умолчанию равен 5.

Один из потоков (главный или родительский) начинает выполняться первым при запуске Java-программы. От главного потока определяются дочерние потоки. Главный поток начинает выполняться первым и заканчивает выполнятся последним. Программа завершается, когда главный поток останавливается.

Поток может быть создан на основе базового класса Thread или реализации интерфейса Runnable. Класс Thread инкапсулирует ряд методов, которые помогают управлять потоками. Главный поток создаётся автоматически с именем main и приоритетом 5 по умолчанию. Им можно управлять через объект класса Thread. Ссылку на него можно получить, используя статический метод:

static currentThread( ).

Пример:

Thread th = Thread.currentThread( ); /*возвращает ссылку на

поток, в котором он вызывается. В

дальнейшем эту объектную ссылку

можно использовать для вызова

методов управления потоками */

Создание нового потока

Самый простой способ создания потока – это реализация интерфейса Runnable, внутри которого определен единственный метод : public void run(). При создании потока (при реализации интерфейса Runnable) в классе требуется реализация метода run():

class A implements Runnable

{ ….

run();

……}

Пример: класс, реализующий многопоточность

class NewThread implements Runnable

{Thread t;

NewThread (); //конструктор для создания нового потока

{ t = new Thread(this, “DemoThread”);

System.out.println(“Дочерний поток ”+t);

t.start(); //стартовать поток

}

public void run()

{ try { for(int i=3; i>0; i--)

{ System.out.println(“Дочерний поток: ”+i);

Thread.sleep(500); //приостановить поток на 500 мс

}

}

catch(Exception e)

{ System.out.println(“Прерывание дочернего потока”);}

System.out.println(“Завершение дочернего потока ”);

} }

//головная программа

class ThreadDemo

{ public static void main(String args[])

{ new NewThread ();

try { for(int i=3; i>0; i--)

{ System.out.println(“Главный поток “);

Thread.sleep(500);

}

}

catch(Exception e)

{ System.out.println(“Прерывание главного потока”);}

System.out.println(“Завершение главного потока ”);

} }

Вывод программы:

Дочерний поток: Thread [DemoThread, 5, main]

Главный поток 3

Дочерний поток 3

Дочерний поток 2

Главный поток 2

Дочерний поток 1

Завершение дочернего потока

Главный поток 1

Завершение главного потока

За счет расчета величины паузы 1000 и 500 мс обеспечивается завершение главного потока после дочернего.

Синхронизация предназначена для разграничения и упорядочивания доступа нескольких потоков к разделяемому ресурсу (напр., таблица БД, файл, статическая переменная).

Обычно в языках программирования распараллеливание и синхронизация реализуется программированием цикла событий и опросом некоторых разделяемых переменных на выполнение какого-то условия, на что теряется время процессора.

В Java такая возможность обеспечивается на уровне семафора, используемого для взаимоисключающей блокировки на критических участках программы. Синхронизация кода реализуется двумя основными способами:

1) синхронизация метода – если критическим участком является метод, то можно просто указать ключевое слово synchronized.

Пример:

synchronized void myMethod()

{……}

или

void myMethod()

{ synchronized(this)

{…….}

}

2)синхронизация объекта – если нет доступа к классу, в котором объявлен метод, то для его синхронизации можно использовать следующий приём:

synchronized(Object)

{ //операторы критического участка, в том числе и вызовы метода

}

Здесь Object – ссылка на объект, который нужно синхронизировать, то есть объект, элементом которого является вызываемый метод.

Если какой-либо из потоков начнет выполнять участок кода, определенный как synchronized, то для других потоков этот участок будет заблокирован до освобождения его первым потоком.