русс | укр

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

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


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


Шановні українці! Матеріал був перекладений з російської мови. Тому можуть бути незначні помикли...

Java thread

Для деяких завдань зручно організувати паралельне виконання декількох частин програми. Кожна з цих самостійних підзадач називається потоком (thread). Існує системний механізм, який забезпечує спільне використанням процесора.

Модель потоків в мові Java є програмним механізмом, що спрощує одночасне виконання декількох операцій в одній і тій же програмі. Процесор періодично виділяє кожному потоці певний відрізок часу. Для кожного потоку все виглядає так, немов процесор використовується в монопольному режимі, але насправді час процесора розділяється між усіма існуючими в програмі потоками. Прискорення можна отримати на многопроцессорном комп'ютері. При використанні потоків немає потреби враховувати ці тонкощі - код не залежить від того, на скількох процесорах буде виконуватися. Таким чином, потоки надають механізм масштабування продуктивності - якщо програма працює надто повільно, можна досягти прискорення, використовуючи багатопроцесорну систему, при цьому, не переписуючи програму заново.

При програмуванні паралельно виконуваних потоків потрібно враховувати наступні моменти:

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

Основні причини використання паралельного виконання:

  • керування кількома подзадачами, одночасне виконання яких дозволяє ефективніше розпоряджатися ресурсами обчислювальної системи (включаючи можливість розподілу цих завдань по декільком процесорам);
  • покращена організація коду;
  • зручність для користувача.

 

Обробний шаблон Worker Thread (Background Thread, Thread Pool) призначений для поліпшення пропускної здатності та мінімізація середньої затримки при реалізації паралельного виконання.

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

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

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

Шаблон Worker Thread рекомендується використовувати коли:

  • потрібно підвищити пропускну здатність програми;
  • необхідно забезпечити одночасне виконання різних фрагментів коду.

Для реалізації потоків у додатку можна створити новий об'єкт Thread і запустити його на виконання. Потік, представлений цим об'єктом, виконає всю доручену йому роботу і автоматично завершиться. Однак створення екземпляра потоку - це марнотратний процес з точки зору продуктивності, він потребує чимало часу і дозволяє виконати тільки одне завдання. Більш ефективний спосіб полягає у створенні об'єкту-"довгожителя" - спеціального обробника потоку, який буде виконувати одну задачу за іншою.

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

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

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

Якщо немає завдань для виконання, обробник періодично перевіряє чергу. Приміщення завдання в чергу - набагато менш вимогливий з точки зору продуктивності процес, ніж створення нового потоку.
Шаблон Worker Thread впливає на продуктивність в декількох напрямках.

  • Клієнту для запуску різних завдань не потрібно створювати кілька об'єктів потоків. Потрібно лише помістити завдання в чергу, що вимагає значно менших накладних витрат, ніж створення об'єкта потоку.
  • Існуючий, але не виконання потік, знижує продуктивність, так як планувальник виділяє частину машинного часу для виконання потоку, що перебуває в стані готовності для виконання. Створення і запуск потоку для кожної задачі означає, що планувальник повинен виділяти ресурси кожного такого потоку індивідуально. У сумі втрати часу на таке планування значно більше, ніж втрати, які виникають при наявності постійно працюючого обробника потоку. Іншими словами, чим більше потоків, тим вище накладні витрати на їх планування. Якщо ж завдання знаходиться в черзі і, відповідно, не виконується, воно взагалі не витрачає машинного часу.
  • Коли завдання є взаємозалежними і якщо чергу послідовна, така ситуація може призвести до блокування системи. Для вирішення цієї проблеми можна використовувати кілька підходів:
    • Створюється стільки обробників потоків, скільки завдань необхідно виконувати одночасно. У додатку потрібно організувати розширюваний пул потоків.
    • У чергу дозволяється розміщувати тільки ті завдання, які не залежать від інших завдань. У таких випадках клієнт повинен не поміщати завдання в чергу, а створити екземпляр власного потоку або запустити окрему чергу з обробником потоку.
    • Створюється інтелектуальна чергу, яка може встановити завдання, які працюють спільно, і ухвалити рішення, коли ту чи іншу завдання передати обробщику потоку. Цей підхід потрібно застосовувати тільки тоді, коли не залишилося інших можливостей, оскільки така інтелектуальна чергу повинна бути тісно пов'язана з додатком, а супровід її програмного коду може стати дуже трудомістким заняттям.

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

Повернутися взміст


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