русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Тема 11 Потоки виконання


Дата додавання: 2014-05-29; переглядів: 1070.


План

1 Багатопоточна архітектура

2 Базові класи для роботи з потоками. Клас Thread

3 Інтерфейс Runnable

4 Робота з пріортетами

 

1 Багатопоточна архітектура

Дотепер у всіх розглянутих прикладах малося на увазі, що в один момент часу виконується лише одне вираження або дія. Однак починаючи з найперших версій, віртуальні машини Java підтримують багатопоточність, тобто підтримку декількох потоків виконання (threads) одночасно.

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

Однак виникає питання - яким же тоді образом забезпечується многопоточность у системах з одним центральним процесором, що, у принципі, виконує лише одне обчислення в один момент часу? У таких системах застосовується процедура квантування часу ( time-slicing). Час розділяється на невеликі інтервали. Перед початком кожного інтервалу приймається рішення, який саме потік виконання буде спрацьовуватися протягом цього кванта часу. За рахунок частого перемикання між задачами эмулируется многопоточная архітектура.

Перший тип додатків, що виграє від підтримки багатопоточності, призначений для задач, де дійсно потрібно виконувати кілька дій одночасно. Наприклад, буде цілком обґрунтовано очікувати, що сервер загального користування стане обслуговувати трохи клієнтів одночасно. Можна легко уявити собі приклад зі сфери обслуговування, коли є кілька потоків клієнтів і бажано обслуговувати їх все одновременно.

Інший приклад - активні ігри, або подібні додатки. Необхідно одночасно опитувати клавіатуру й інші пристрої уведення, щоб реагувати на дії користувача. У той же час необхідно розраховувати й перемальовувати стан, що змінюється, ігрового поля.

Зрозуміло, що у випадку відсутності підтримки багатопоточності для реалізації подібних додатків треба було б реалізовувати квантування часу вручну. Умовно говорячи, одну секунду перевіряти стан клавіатури, а наступну - перераховувати й перемальовувати ігрове поле..

Наступна перевага виникає з того, що комп'ютер складається не тільки з одного або декількох процесорів. Обчислювальний пристрій - лише один з ресурсів, необхідних для виконання задач. Завжди є оперативна пам'ять, дискова підсистема, мережні підключення, периферія й т.д. Припустимо, користувачеві потрібно роздрукувати великий документ і скачати великий файл із мережі. Очевидно, що обидві задачі вимагають зовсім незначної участі процесора, а основні необхідні ресурси, які будуть задіяні на межі можливостей, у них різні - мережне підключення й принтер. Виходить, якщо виконувати задачі одночасно, те вповільнення від організації квантування часу буде незначним, процесор легко впорається з обслуговуванням обох задач. У той же час, якщо кожна задача окремо займала, скажемо, друга година, те цілком імовірно, що й при одночасному виконанні буде потрібно не більше тих же двох годин, а зроблено при цьому буде набагато більше.

Третя перевага з'являється через можливість більш гнучко управляти виконанням задач. Припустимо, користувач системи, що не підтримує багатопоточність, вирішив скачати великий файл з мережі, або зробити складне обчислення, що займає, скажемо, дві години. Запустивши задачу на виконання, він може раптово виявити, що йому потрібний не цей, а який-небудь інший файл (або обчислення з іншими початковими параметрами). Однак якщо додаток займається тільки роботою з мережею (обчисленнями) і не реагує на дії користувача (не обробляються дані із пристроїв введення, таких як клавіатура або миша), то він не зможе швидко виправити помилку. Виходить, що процесор виконує більшу кількість обчислень, але при цьому приносить набагато менше користі.

Процедура квантування часу підтримує пріоритети (priority) задач. В Java пріоритет представляється цілим числом. Чим більше число, тим вище пріоритет.

Розглянемо, як потоки реалізовані в Java.


<== попередня лекція | наступна лекція ==>
Тема 10 Робота з інтерфейсами | Базові класи для роботи з потоками. Клас Thread


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн