Студопедия
Новини освіти і науки:
МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах


РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання


ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ"


ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ


Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків


Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні


Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах


Гендерна антидискримінаційна експертиза може зробити нас моральними рабами


ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ


ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів



Інтерфейс Runnable

План

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

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

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

3 Інтерфейс Runnable

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

 

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

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

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

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

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

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

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

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

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

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

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

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

Потік виконання в Java представляється екземпляром класу Thread. Для того, щоб написати свій потік виконання, необхідно успадковуватися від цього класу й перевизначити метод run(). Наприклад:

public class MyThread extends Thread { public void run() { // деяка довга дія, обчислення long sum=0; for (int i=0; i<1000; i++) { sum+=i; } System.out.println(sum); }}

Метод run() містить дії, які повинні виконуватися в новому потоці виконання. Щоб запустити його, необхідно створити екземпляр класу-спадкоємця й викликати успадкований метод start(), що повідомляє віртуальній машині, що потрібно запустити новий потік виконання й почати виконувати в ньому метод run().

MyThread t = new MyThread();t.start();

Коли метод run() завершений (зокрема, зустрілося вираження return), потік виконання зупиняється. Однак ніщо не перешкоджає записи нескінченного циклу в цьому методі. У результаті потік не перерве свого виконання й буде зупинений тільки при завершенні роботи всього додатка.

Описаний підхід має один недолік. Оскільки в Java множинне спадкування відсутнє, вимога успадковуватися від Thread може привести до конфлікту. Якщо ще раз подивитися на наведений вище приклад, стане зрозуміло, що спадкування вироблялося тільки з метою перевизначення методу run(). Тому пропонується більше простий спосіб створити свій потік виконання. Досить реалізувати інтерфейс Runnable, у якому оголошений тільки один метод - уже знайомий void run(). Запишемо приклад, наведений вище, за допомогою цього інтерфейсу:

public class MyRunnable implements Runnable { public void run() { // деяка довга дія, обчислення long sum=0; for (int i=0; i<1000; i++) { sum+=i; } System.out.println(sum); }}

Також незначно міняється процедура запуску потоку:

Runnable r = new MyRunnable();Thread t = new Thread(r);t.start();

Якщо раніше об'єкт, що представляє сам потік виконання, і об'єкт із методом run(), що реалізує необхідну функціональність, були об'єднані в одному екземплярі класу MyThread, то тепер вони розділені. Який із двох підходів удобней, вирішується в кожному конкретному випадку.

Підкреслимо, що Runnable не є повною заміною класу Thread, оскільки створення й запуск самого потоку виконання можливо тільки через метод Thread.start().

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

Розглянемо, як в Java можна призначати потокам пріоритети. Для цього в класі Thread існують методи getPriority() і setPriority(), а також оголошені три константи:

MIN_PRIORITYMAX_PRIORITYNORM_PRIORITY

 

З назви зрозуміло, що їхнього значення описують мінімальне, максимальне й нормальне (за замовчуванням) значення пріоритету.


 

Тема 12 Синхронізація


Читайте також:

  1. Cisco Packet Tracer - Знайомство з програмою. Інтерфейс
  2. WEB-документи та CGI-інтерфейси
  3. Аналіз паралельного інтерфейсу з DSP-процесорами: читання даних з АЦП, що під’єднаний до адресного простору пам’яті
  4. Аналіз послідовного інтерфейсу з DSP-процесорами
  5. Багаторівневий підхід. Протокол. Інтерфейс. Стек протоколів.
  6. Визначення конфігурації мережевих інтерфейсів
  7. Віконний, графічний інтерфейс.
  8. Внутрішні GSM - інтерфейси
  9. Електричний інтерфейс RS-232C
  10. Ієрархія мережевих інтерфейсів
  11. Інтерфейс Collection




Переглядів: 1033

<== попередня сторінка | наступна сторінка ==>
Інтерфейси | Блокування

Не знайшли потрібну інформацію? Скористайтесь пошуком google:

  

© studopedia.com.ua При використанні або копіюванні матеріалів пряме посилання на сайт обов'язкове.


Генерація сторінки за: 0.002 сек.