Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры-2 оопип часть 4.doc
Скачиваний:
46
Добавлен:
01.04.2014
Размер:
445.44 Кб
Скачать

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 ( ); на том же объекте.