Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab12_Java_Vkazivky_2010_Multithreading.doc
Скачиваний:
7
Добавлен:
17.04.2019
Размер:
921.6 Кб
Скачать

If (! ready) wait();

ready = false;

return inform;

}catch(InterruptedException ie){

}finally!

notify();

}

return -1;

}

synchronized public void setlnform(int n)(

If (ready)

try{

wait ();

}catch(InterruptedException ie){}

inform = n;

ready = true;

notify();

}

}

Оскільки сповіщення поставщика в методі getinform() повинно відбуватися уже після відправки інформації оператором return inform, воно включено в блок finally{}

Зверніть увагу: повідомлення "Got: 0" відстає на один крок від дійсного отримання інформації.

Рис. 17.5. Узгоджена робота підпроцесів

17.5. Пріоритети підпроцесів

Планувальник підпроцесів віртуальної машини Java призначає кожному підпроцесу однаковий час виконання процесором, переключаючись з підпроцеса на підпроцес по закінченню цього часу. Інколи необхідно виділити якомусь підпроцесу більше або менше часу в порівнянні з іншим підпроцесом. В такому випадку можна задати підпроцесу більший або менший пріоритет. В класі Thread єсть три цілі статичні константи, що задають пріоритети:

  • NORM_PRIORITY — звичайний пріоритет, який одержує кожний підпроцес при запуску, його числове значення 5;

  • MIN_PRIORITY — найменший пріоритет, його значення 1;

  • MAX_PRIORITY — найвищий пріоритет, його значення 10.

Крім цих значень можна задать будь-яке проміжне значення від 1 до 10, але треба памятати про те, що процесор буде переключатися між підпроцесами з однаковим вищим пріоритетом, а підпроцеси з меншим пріоритетом не стануть виконуватися, якщо тільки не призупинені всі підпроцеси з вищим пріоритетом. Тому для підвищення загальної продуктивності належить призупиняти час від часу методом sleep() підпроцеси з високим пріоритетом.

Установити той чи інший пріоритет можна в будь-який час методом setPriorityfint newPriority), якщо підпроцес має право змінювати свій пріоритет. Перевірити наявність такого права можна методом checkAtcess(). Цей метод викидає виключення класу SecurityЕxception, якщо підпроцес не може змінити свій пріоритет. Породжені підпроцеси будуть мати той же пріоритет, що і підпроцес-батько. Отже, підпроцеси, як правило, повинні працювати з пріоритетом NORM_PRIORITY. Підпроцеси більшу частину часу очікуючі настання якоїсь події, наприклад, натискання користувачем кнопки Вихід, можуть отримати більш високий пріоритет MAX_PRIORITY. Підпроцеси, виконуючі тривалу роботу, наприклад, установку мережевого зєднання або рисування зображення в памяті при подвійній буферизації, могжть працювати з нижчим пріоритетом MIN_PRIORITY.

17.6. Підпроцеси-демони

Робота програми починається з виконання метоуа main() головним підпроцесом. Цей підпроцес може породити інші підпроцеси, вони, в свою чергу, здатні породити свої підпроцеси. Після цього головний підпроцес нічим не буде відрізнятися від решти підпроцесів. Він не слідкує за породженими ним підпроцесами, не чекає від них ніяких сигналів. Головний підпроцес може завершитися, а програма буде продовжувати роботу, доки не закінчить роботу останній підпроцес. Це правило не завжди зручне. Наприклад, якийсь із підпроцесів може призупинитися, очікуючи мережевого зєднання, яке ніяк не може наступити. Користувач, не дочекавшись зєднання, зупиняє роботу головного підпроцесу, але програма продовжує працювати.

Такі випадки можна врахувати, оголосивши деякі підпроцеси демонами (daemons). Це поняття не співпадає з поняттям демона в UNIX. Просто програма завершується по закінченні роботи останнього користувальського (user) підпроцесу, не чекаючи закінчення роботи демонів. Демони будуть примусово завершені виконуючою системою Java. Оголосити підпроцес демоном можна зразу після його створення, перед запуском. Це робиться методом setDaemon(true). Даний метод звертаэться до методу checkAccess() і може викинути SecurityException. Змінити статус демона після запуску процесу уже неможна. Всі підпроцеси, породжені демоном, теж будуть демонами. Для зміни їх статусу необхідно звернутися до методу setDaemon(false).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]