Використання Runnable

В інтерфейсі Runnable абстрагується концепція якоїсь сутності, що виконує програму під час своєї активності Інтерфейс Runnable оголошує всього один метод:

public void run()

Клас Thread реалізує інтерфейс Runnable, оскільки потік якраз і є такою сутністю – під час його активності виконується програма Ми вже бачили, що для здійснення якихось особливих обчислень можна розширити клас Thread, проте в багатьох випадках це не надто просто Насамперед, розширення класів проводиться на основі одиночного наслідування – якщо деякий клас розширюється для того, щоб він міг виконуватися в потоці, то одночасно розширити і його, і Thread не вдасться Крім того, якщо вам потрібна тільки можливість виконання, то навряд чи ви захочете успадковувати і всі накладні витрати, повязані з Thread

У багатьох випадках простіше реалізувати Runnable Обєкт Runnable може виконуватися в окремому потоці – для цього слід передати його конструктору Thread Якщо обєкт Thread конструюється з обєктом Runnable, то реалізація Threadrun викликає метод run переданого обєкта

Наведемо версію класу PingPong, в якій використовується інтерфейс Runnable Порівняння цих двох версій показує, що вони виглядають майже однаково Найбільш суттєві відмінності полягають в супертіпа (Runnable замість Thread) і методі main:

class RunPingPong inplements Runnable {

String word / / Виведене слово

int delay / / Тривалість паузи

PingPong(String whatToSay, int delayTime) {

word = whatToSay

delay = delayTime

}

public void run() {

try {

for (;) {

Systemoutprint (word + “) Threadsleep (delay) / / Почекати наступного

/ / Виведення

}

} catch (InterruptedException e) {

return / / Завершити потік

}

}

public static void main(String[] args) {

Runnable ping = new RunPingPong(&quotping&quot,  33) Runnable pong = new RunPingPong(&quotPONG&quot, 100)

}

}

Спочатку визначається новий клас, який реалізує інтерфейс Runnable Код методу run в цьому класі збігається з його реалізацією в класі PingPong У методі main створюються два обєкти RunPingPong з різними тимчасовими інтервалами потім для кожного з них створюється і негайно запускається новий обєкт Thread

Існує чотири конструктора Thread, яким передаються обєкти Runnable:

public Thread(Runnable  target)

Конструює новий обєкт Thread, який використовує метод run зазначеного класу target public Thread(Runnable  target, String name)

Конструює новий обєкт Thread із заданим імям name, що використовує метод run

зазначеного класу target

public Thread(ThreadGroup group, Runnable target)

Конструює новий обєкт Thread, що входить в задану групу ThreadGroup і використовує метод run зазначеного класу target

public Thread(ThreadGroup  group, Runnable target, String name)

Конструює новий обєкт Thread із заданим імям name, що входить в задану групу ThreadGroup і використовує метод run зазначеного класу target

912 Ключове слово volatile

Механізм синхронізації допомагає у вирішенні багатьох проблем, однак, якщо ви відмовитеся від його використання, відразу декілька потоків зможуть одночасно змінювати значення деякого поля Якщо це робиться навмисно (може бути, для синхронізації доступу використовуються інші засоби), слід оголосити поле з ключовим словом volatile Наприклад, якщо у вас є змінна, значення якої постійно відображається потоком графічного виведення і може змінюватися сінхронизований методами, то фрагмент висновку може виглядати наступним чином:

currentValue = 5

for ( ) {displayshowValue (currentValue) Threadsleep (1000) / / Почекати 1 секунду

}

Якби значення currentValue не могло змінюватися всередині методу ShowValue, то компілятор міг би припустити, що величина current Value залишається в циклі постійною, і просто використовувати константу 5 замість виклику showValue

Однак, якщо під час виконання циклу значення currentValue може бути змінено іншим потоком, то припущення компілятора буде невірним Оголошення поля currentValue з ключовим словом volatile не дозволяє компілятору робити подібні припущення

Джерело: Арнольд К, Гослінг Д – Мова програмування Java (1997)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*