Ім'я файлу: Реферат.docx
Розширення: docx
Розмір: 48кб.
Дата: 30.11.2021
скачати

МІНІСТЕРСТВО ОСВІТИ І НАУКИ

ЧЕРКАСЬКИЙ ДЕРЖАВНИЙ БІЗНЕС-КОЛЕДЖ

РЕФЕРАТ

З ДІСЦИПЛІНИ «ЛЮДИНО-МАШИННИЙ ІНТЕРФЕЙС»

НА ТЕМУ: “Огляд багатопоточності в Java”





Виконав:

Студент групи 2П-17

Бобрицький Дмитро

Перевірила:

Черниш С.В.


ЧЕРКАСИ 2021

ЗМІСТ

ВСТУП 3

1. Що таке багатопоточність 4

2. Процеси 4

3. Способи реалізації багатопоточності 5

4. Runnable 6

5. Thread 7

6. Проблеми, які створює многопоточность в Java 11

7. Проблеми, які вирішує многопоточность в Java 11

ВИСНОВОК 13

СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ 14

ВСТУП
На Java потоки можна розглядати як основу одночасності. Потік - це виконуваний, легкий блок, який отримує доступ до спільних ресурсів, а також до власного стеку викликів.
Додаток Java - це один процес, і в цій програмі ми можемо мати кілька потоків для досягнення паралельності.
Ми знаємо, що програма, що працює в системі, може мати кілька екземплярів, і їх зазвичай називають додатками з багатьма документами. Ці екземпляри додатків називаються процесами. Кожному з цих процесів присвоюється блок виконання, відомий як потік.
Залежно від операційної системи та вимог програми, процесу може бути призначений або один потік, або кілька потоків. Коли процесу застосування присвоюється декілька потоків, тоді нам потрібно виконувати ці кілька потоків одночасно.

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

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

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

Для кожного процесу ОС створює так зване «віртуальне адресний простір», до якого процес має прямий доступ. Це простір належить процесу, містить тільки його дані і знаходиться в повному його розпорядженні. Операційна система ж відповідає за те, як віртуальний простір процесу проектується на фізичну пам'ять.

Схема цієї взаємодії представлена ??на рис. 1. Операційна система оперує так званими сторінками пам'яті, які являють собою просто область певного фіксованого розміру. Якщо процесу стає недостатньо пам'яті, система виділяє йому додаткові сторінки з фізичної пам'яті. Сторінки віртуальної пам'яті можуть проектуватися на фізичну пам'ять в довільному порядку.

При запуску програми операційна система створює процес, завантажуючи в його адресний простір код і дані програми, а потім запускає головний потік створеного процесу.
Способи реалізації багатопоточності
Для реалізації багатопоточності в Java передбачено два способи:

1. Використання успадкування від класу Thread.

2. Використання інтерфейсу Runnable.

Перший спосіб, коли програма запускається, в ній вже існує один потік, який називається основним. Як тільки він завершується, то завершуються всі підпотоки. Тому необхідно слідкувати за тим, щоб даний потік завершувався останнім. Отримати вказівник на даний потік можна з допомогою наступного коду:

Thread t = Thread.currentThread();

Цей спосіб – використання реалізації інтерфейсу Runnable. Для цього необхідно визначити заголовок класу наступним чином:

class NewThread implements Runnable

Другий спосіб – використання наслідування від класу Thread. Переробимо програму для цього способу. При цьому необхідно змінити тільки заголовок класу NewThread.

class NewThread extends Thread

Клас Thread та інтерфейс Runnable містять метод run(), який програміст повинен перевизначити. Всередині даного методу необхідно розміщувати оператори, які будуть виконуватись в новому потоці. Оскільки головний потік повинен завершуватись останнім, то використовують метод join(), який очікує поки завершиться потік для якого даний метод викликаний.
Runnable
Можна створювати класи потоків, реалізуючи інтерфейс Runnable. Це буває часом значно зручніше. Наприклад, код з попереднього прикладу можна переписати так (лістинг 5.9).

Лістинг 5.9.

Створення класів потоків з використанням інтерфейсу Runnable


У деяких випадках так видається зручніше: зазвичай у подібного створення потоків більш короткий запис.

І в тому і в іншому випадку потоку можна присвоїти ім'я. Зазвичай воно задається в конструкторі в якості останнього параметра.
Thread
Один потік - це одна одиниця виконання коду. Кожен потік послідовно виконує інструкції процесу, якому він належить, паралельно з іншими потоками цього процесу.

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

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

Простіше кажучи, при псевдопараллельном виконанні потоків процесор метається між виконанням декількох потоків, виконуючи по черзі частина кожного з них.
Щоб створити свій потік, необхідно створити дочірній клас класу Thread. Давайте створимо такий клас і потім розберемо весь текст програми (лістинг 5.7).
Лістинг 5.7.

Створення потоку на основі класу Thread
public class MyThread extends Thread{

private int seconds;
public MyThread(int seconds) {

this.seconds = seconds;

}
public void run() {

try {

for (int i = 0; i < this.seconds; i++) {

Thread.sleep(1000);

System.out.println("Идет секунда: " + i);

}

} catch (InterruptedException e) {

System.out.println("У нас проблемы с потоком");

}

}
public static void main(String[] args) {

MyThread myThread = new MyThread(5);

myThread.start();

new MyThread(15);

}

}
Спочатку ми створюємо дочірній клас для класу Thread, потім - конструктор з параметром, який встановить кількість секунд виконання потоку. Після цього ми визначаємо метод run. який починає діяти при запуску потоку.

Щоб його викликати, необхідно викликати метод start () - «стартувати потік».
У класу Thread є метод sleep, який дозволяє призупинити виконання потоку на задану кількість мілісекунд (увага: відлік йде в мілісекундах). Щоб використовувати цей метод, необхідно помістити його в блок try, а блок catch зробити обробляють виняток InterruptedException. Потім ми запускаємо два потоки, які будуть виконуватися одночасно. Щоб їх розрізнити, можна переробити код так (лістинг 5.8).
Лістинг 5.8.

Створення двох потоків, які будуть виконуватися в класі Thread одночасно
public class MyThread extends Thread{

private int seconds;

private static int numbers = 0;

private int number;
public static int setNumber() {

return ++numbers;

}
public MyThread(int seconds) {

this.seconds = seconds;

number = MyThread.setNumber();

}

public void run() {

try {

for (int i = 0; i < this.seconds; i++) {

Thread.sleep(1000);

System.out.println("Идет секунда: " + i + " выполнения потока под номером " + this.number);

}

} catch (InterruptedException e) {

System.out.println("У нас проблемы с потоком");

}

}
public static void main(String[] args) {

MyThread myThread = new MyThread(5);

myThread.start();

new MyThread(15).start();

}

}
Тепер ми кожного потоку привласнили свій унікальний номер.
Проблеми, які створює многопоточность в Java
Многопоточность вирішує досить важливі завдання, і її використання прискорює роботу наших програм. У багатьох випадках - в рази. Але многопоточность недарма вважається складною темою. Адже при неправильному використанні вона створює проблеми замість того, щоб вирішувати їх. Говорячи «створювати проблеми» я не маю на увазі щось абстрактне. Є дві конкретні проблеми, які може викликати використання багатопоточності - взаємне блокування (deadlock) і стан гонки (race condition).

Deadlock - ситуація, при якій кілька потоків знаходяться в стані очікування ресурсів, зайнятих один одним, і жоден з них не може продовжувати виконання.

Стан гонки - помилка проектування багатопотокової системи або додатки, при якій робота системи або додатки залежить від того, в якому порядку виконуються частини коду.

Проблеми, які вирішує многопоточность в Java
По суті, багатопоточність була придумана, щоб вирішити дві головні завдання:

Одночасно виконувати кілька дій.

Уяви, що у тебе є програма з призначеним для користувача інтерфейсом. При натисканні кнопки «Продовжити» всередині програми повинні відбутися якісь обчислення, а користувач повинен побачити наступний екран інтерфейсу. Якщо ці дії здійснюються послідовно, після натискання кнопки «Продовжити» програма просто зависне. Користувач буде бачити все той же екран з кнопкою «Продовжити», поки все внутрішні обчислення не будуть виконані, і програма не дійде до частини, де почнеться отрисовка інтерфейсу.

Прискорити обчислення.

Тут все набагато простіше. Якщо наш процесор має кілька ядер, а більшість процесорів зараз багатоядерні, список наших завдань можуть паралельно вирішувати декілька ядер. Очевидно, що якщо нам потрібно вирішити 1000 задач і кожна з них вирішується за секунду, одне ядро ​​впорається зі списком за 1000 секунд, два ядра - за 500 секунд, три - за 333 з невеликим секунди і так далі.

ВИСНОВКИ
Це все про впровадження багатопоточності. У цьому підручнику ми обговорювали паралельність та багатопоточність у Java. Ми обговорили створення потоку з класом Thread, а також інтерфейсом Runnable і навели відповідні приклади.

Ми також детально вивчили поняття єдиної нитки та її створення. Концепції ниток, включаючи життєвий цикл нитки, зупинку нитки, типи ниток тощо, обговорювались у цьому посібнику.

Ми також обговорили багатопотоковість і довжину та паралельність у Java. Наприкінці цього підручника читач повинен мати можливість легко зрозуміти поняття паралельності та багатопоточності, а також потоки в Java.

СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ

1. Fandroid [Електронний ресурс] – Режим доступу до ресурсу: https://www.fandroid.info/chto-takoe-mnogopotochnost-rabota-s-potokami-v-java/

2. Habr [Електронний ресурс] – Режим доступу до ресурсу: https://habr.com/ru/post/164487/

3. Smekni [Електронний ресурс] – Режим доступу до ресурсу: https://smekni.com/a/311416-2/oglyad-tekhnolog-servletv-2/

4. Javarush [Електронний ресурс] – Режим доступу до ресурсу: https://javarush.ru/groups/posts/1992-mnogopotochnostjh-v-java-sutjh-pljusih-i-chastihe-lovushki-
скачати

© Усі права захищені
написати до нас