
4-1 Мережне програмування / ПЗ - 04 Взаємодія з веб сервером по протоколу HTTP, багатопотокова версії програми
..docxМіністерство освіти і науки України
Харківський національний університет радіоелектроніки
Факультет Інфокомунікацій .
Кафедра Інфокомунікаційної інженерії імені В.В. Поповського .
ЗВІТ
з практичної роботи №4
з дисципліни
Мережне програмування
Тема заняття: Взаємодія з веб сервером по протоколу HTTP, багатопотокова версії програми.
Харків 2020 р.
Мета роботи: Навчитися створювати Java-програми для клієнтів, які здійснюють взаємодію з сервером за протоколом HTTP. Вивчення можливості бібліотеки ApacheHttpComponents. Робота з багатозадачністю з використанням пулу потоків з бібліотеки Concurrency. Використання фреймворка для автоматизації збирання проектів Maven для опису і завантаження бібліотек-залежностей проекту.
ХІД ВИКОНАННЯ
На рисунку 1 показано створення додатку для взаємодії з сервером за протоколом http.
Рисунок 1 – Код програми WorkerThread.java
На рисунку 2 показано створення додатку для взаємодії з сервером за протоколом http.
Рисунок 2 – Код програми SimpleThreadPool.java
На рисунку 3 показано виконання програми.
Рисунок 3 – Результат виконання
На рисунку 3 показаний результат виконання даної програми. GET повертає http коди відповіді сервера. Код 200 показує, що сайт доступний для зв’язку. Також сервер може повернути багато інших кодів, наприклад знаменитий код 404, сайт відсутній.
ВИСНОВКИ
В ході даної роботи я створив додаток, який здійснює взаємодію з сервером по протоколу HTTP, також дослідив можливості бібліотеки ApacheHttpComponents. Отримав практичні навички у багатозадачній роботі з використанням пулу потоків з бібліотеки Concurrency. Використовував у роботі фреймворк для автоматизації збирання проектів Maven.
Завдання на лабораторну роботу виконано у повному обсязі.
Контрольні питання
Багатопоточність. Застосування та недоліки.
Багатопоточність — властивість застосунку, яка полягає в тому, що породжений процес може складатися з кількох потоків, що виконуються паралельно. При виконанні деяких завдань таке розділення може досягти ефективнішого використання ресурсів комп'ютера.
Багатопоточність корисна і рекомендована до застосування:
при роботі з GUI (для зниження часу відгуку, реалізації «довгограючих» операцій)
при роботі з блокуючими операціями - наприклад, введення / висновок - сокети, диск і т.п.
при наявності можливості паралельної обробки істотних обсягів інформації, коли розпаралелювання операцій досить легко реалізується.
У потоків є наступні недоліки:
Створення багатопоточної програми вимагає ретельної розробки. Імовірність появи незначних тимчасових збоїв або помилок, викликаних ненавмисним спільним використанням змінних, в такій програмі досить значна.
Налагодження багатопоточної програми набагато важче, ніж налагодження одного потоку виконання, оскільки взаємозв'язку потоків дуже важко контролювати.
Програма, в якій громіздкі обчислення розділені на дві частини, і ці дві частини виконуються як окремі потоки, необов'язково буде працювати швидше на машині з одним процесором, якщо тільки обчислення не дозволяє виконувати обидві її частини одночасно і у машини, на якій виконується програма, немає багатоядерного процесора для підтримки справжньої багатопоточної.
Ім’я, пріоритет і група потоку.
Для роботи з потоками створюється екземпляр класу Thread. Метод public String toString() повертає рядкове представлення потоку, включаючи ім'я потоку, пріоритет і ім'я групи.
Розподіли процесорного часу між потоками в Java виконується за наступними правилами: коли потік блокується, тобто припинений, переходить в стан очікування або повинен дочекатися якоїсь події, Java вибирає інший потік з тих, які готові до виконання. Вибирається потік, що має найбільший пріоритет. Якщо таких декілька, вибирається будь-якій з них. Пріоритет потоку можна встановити методом setPriority.
Пріоритет потоку повинен бути числом в діапазоні від Thread.MIN_PRIORITY до Thread.MAX_PRIORITY. Будь-яке значення поза цими межами викликає виключення IllegalArgumentException. За умовчанням потоку приписується пріоритет Thread.NORM_PRIORITY. Значення пріоритету потоку можна з'ясувати за допомогою методу getPriority().
Методи Start( ) і Run().
Запуск потоку виконує метод start() (виключення кидається, якщо робиться спроба запуску вже запущеного потоку). Для зупинки потоку рекомендується потоку, що зупиняється, привласнити значення null, наприклад: Thread myThread; myThread.start(); myThread = null;
Інтерфейс Runnable має тільки один метод run(). Клас Thread також реалізує цей інтерфейс, проте стандартна реалізація run() у класі Thread не виконує ніяких операцій. Необхідно або розширити клас Thread, щоб включити в нього новий метод run(), або створити об'єкт Runnnable і передати його конструктору потоку. Коли створюється клас, що реалізовує інтерфейс Runnable, цей клас повинен перевизначити метод run(). Саме цей метод виконує фактичну роботу, покладену на конкретний потік.
Асинхронне виконання потоків.
Асинхронність означає те, що не можна стверджувати, що будь-яка інструкція одного потоку, виконається раніше або пізніше інструкції іншого. Іншими словами, паралельні потоки незалежні один від одного, за винятком тих випадків, коли програміст сам описує залежності між потоками за допомогою передбачених для цього конструкцій мови.