реривання потоку. Можна помітити що методи sleep () і join () обгорнуті в конструкції try-catch. Це необхідна умова роботи цих методів. Зухвалий їх код повинен перехоплювати виключення InterruptedException, яке вони кидають при перериванні під час очікування.
2. Методи використовуються при роботі з потоками
.1. Метод Thread.sleep ()
.sleep () - статичний метод класу Thread, який призупиняє виконання потоку, в якому він був викликаний. Під час виконання методу sleep () система перестає виділяти потоку процесорний час, розподіляючи його між іншими потоками.
Метод sleep () може виконуватися або задане кол-во часу (мілісекунди або наносекунди) або до тих пір поки він не буде зупинений перериванням (в цьому випадку він згенерує виняток InterruptedException).
Приклад 7.
.sleep (1500);// Чекає півтори секунди.sleep (2000, 100);// Чекає 2 секунди і 100 наносекунд
Незважаючи на те, що метод sleep () може приймати як часу очікування наносекунди, не варто приймати це всерйоз. У багатьох системах час очікування все одно округляється до мілісекунд а то й до їх десятків.
2.2. Метод yield ()
Статичний метод Thread.yield () змушує процесор переключитися на обробку інших потоків системи.
Метод може бути корисним, наприклад, коли потік очікує настання якої-небудь події і необхідно щоб перевірка його настання відбувалася якомога частіше.
У цьому випадку можна помістити перевірку події і метод Thread.yield () в цикл:
Приклад 8.
//Очікування надходження повідомлення (! msgQueue.hasMessages ())//Поки в черзі немає повідомлень
{. yield ();//Передати управління іншим потокам
}
2.3. Метод join ()
У Java передбачений механізм, що дозволяє одному потоку чекати завершення виконання іншого. Для цього використовується метод join (). Наприклад, щоб головний потік почекав завершення побаченого потоку myThready, необхідно виконати інструкцію myThready.join () в головному потоці. Як тільки потік myThready завершиться, метод join () поверне управління, і головний потік зможе продовжити виконання.
Метод join () має перевантажену версію, яка отримує як параметр час очікування. У цьому випадку join () повертає керування або коли завершиться очікуваний потік, або коли закінчиться час очікування. Подібно до методу Thread.sleep () метод join може чекати протягом мілісекунд і наносекунд - аргументи ті ж.
За допомогою завдання часу очікування потоку можна, наприклад, виконувати оновлення анімованої картинки поки головний (або будь-який інший) потік чекає завершення побаченого потоку, що виконує ресурсомісткі операції:
Приклад 9.
Thinker brain=new Thinker ();// Thinker - нащадок класу Thread..start ();//Почати обдумування .
{. refresh ();//mThinkIndicator - анімована картинка.
try {.join (250);//Почекати закінчення думки чверть секунди.
} catch (InterruptedException e) {}
} (brain.isAlive ());//Поки brain думає ...
//brain закінчив думати (звучать овації).
У цьому прикладі потік brain (мозок) думає над чимось, і передбачається, що це займає у нього тривалий час. Головний потік чекає його чверть секунди і, у разі, якщо цього часу на роздуми не вистачило, оновлює «індикатор роздумів» (деяка анімована картинка). У підсумку, під час роздумів, користувач спостерігає на екрані індикатор розумового процесу, що дає йому знати, що електронні мізки ніж те зайняті.
3. Пріоритети потоків
Кожен потік в системі має свій пріоритет. Пріоритет - це деяке число в об'єкті потоку, більш високе значення якого означає більший пріоритет. Система в першу чергу виконує потоки з великим пріоритетом, а потоки з меншим пріоритетом отримують процесорний час тільки тоді, коли їх більш привілейовані побратими простоюють.
Працювати з пріоритетами потоку можна за допомогою двох функцій: setPriority (int priority) - встановлює пріоритет потоку.
Можливі значення priority - MIN_PRIORITY, NORM_PRIORITY і MAX_PRIORITY.int getPriority () - отримує пріоритет потоку.
Деякі корисні методи класу Thread роботи з потокамі.isAlive () - повертає true якщо myThready () виконується і false якщо потік ще не був запущений або був завершений.
setName (String threadName) - Задає ім'я потоку.
String getName () - Отримує ім'я потоку.
Ім'я потоку - асоційована з ним рядок, який в деяких випадках допомагає зрозуміти, який потік виконує деяку дію. Іноді це буває полезним.Thread Thread.currentThread () - статичний метод, який повертає об'єкт потоку, в якому він був визван.getId () - повертає ідентифікатор потоку. Ідентифікатор - унікальне число, присвоєне потоку.
блокування голодування потік запуск