Содержание

Слайд 2

Базові поняття

Потоки (threads) - підтримка багатопоточності на рівні самої мови.
В одній програмі

Базові поняття Потоки (threads) - підтримка багатопоточності на рівні самої мови. В
можна запустити декілька потоків, які будуть працювати паралельно.

Слайд 3

Деякі застосування

“Чутливі” графічні застосування: в одному потоці виконується анімація та інші операції,

Деякі застосування “Чутливі” графічні застосування: в одному потоці виконується анімація та інші
а в іншому – кнопка для зупинки та інші елементи керування.
Сокети.

Слайд 4

Потоки: основи

Кожний потік є екземпляром класу Thread.
Функціональність потоку визначається методом run(). Потік

Потоки: основи Кожний потік є екземпляром класу Thread. Функціональність потоку визначається методом
завершується, коли завершується виконання коду цього методу (або виникає неперехоплене виключення).
Запуск потоку здійснюється методом start().

Слайд 5

Організація потоків: два способи

створення екземпляру класу, похідного від класу Thread;
реалізація інтерфейсу Runnable;

Організація потоків: два способи створення екземпляру класу, похідного від класу Thread; реалізація
досить типовим є використання анонімних класів.

Слайд 6

Приклад запуску потоку

Thread t = new Thread (new Runnable(){
public void run()

Приклад запуску потоку Thread t = new Thread (new Runnable(){ public void
{
for (int i=0;i<1000;i++) {
result+=Math.random()-0.5;
}
}
});
t.start(); //Запуск потоку

t.join(); //Без цього виведення може бути некоректним
System.out.println(“Result is "+result);

Слайд 7

Більш простий запуск (якщо достатньо анонімного потоку)

new Thread () {
@Override

Більш простий запуск (якщо достатньо анонімного потоку) new Thread () { @Override
public void run() {
for (int i=0;i<1000;i++) {
result+=Math.random()-0.5;
}
System.out.println("Test indicator is "+result);
}
}.start();

Слайд 8

Клас, похідний від Thread

Основна функціональність потоку визначається в методі run().
Щоб запустити потік,

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

Слайд 9

Реалізація інтерфейсу Runnable

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

Реалізація інтерфейсу Runnable Наприклад, якщо клас уже є підкласом деякого іншого класу.
методом run().
Типова схема запуску потоку: створюється екземпляр класу Thread, конструктору якого передається вказівник на екземпляр нашого класу. Далі викликається start().
Знову-ж таки - часто в конструкторі, і тоді:
Thread tr = new Thread(this);
tr.start();
Досить типово – як анонімний клас.

Слайд 10

Приклад програми з кількома потоками

Програма demopotok в каталозі threads.
Створюються три потоки; вони

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

Слайд 11

Коментарі: функціональність потоку

public void run() {
while (PassesPasses++;
TotalPasses++;
System.out.println(Passes+"-th pass of thread number

Коментарі: функціональність потоку public void run() { while (Passes Passes++; TotalPasses++; System.out.println(Passes+"-th
"+Nomer+"; total passes - "+TotalPasses);
try {sleep(Delay);
}
catch (InterruptedException e) {
System.out.println("Something strange...");
}}
System.out.println ("Thread number "+Nomer+" stopped");
}

Слайд 12

Коментарі: конструктор

public potok(int Delay) {
this.Delay=Delay;
this.start();
Number++;
Nomer=Number;
System.out.println("Thread number "+Nomer+ " started");
}

Коментарі: конструктор public potok(int Delay) { this.Delay=Delay; this.start(); Number++; Nomer=Number; System.out.println("Thread number "+Nomer+ " started"); }

Слайд 13

Коментарі: початкова ініціалізація

static int MaxPasses;
static {System.out.println("Enter amounts of passes");
try {BufferedReader br=new BufferedReader(

Коментарі: початкова ініціалізація static int MaxPasses; static {System.out.println("Enter amounts of passes"); try
new InputStreamReader
(System.in));
MaxPasses = Integer.parseInt(br.readLine());
}
catch (Exception e) {System.exit(1);}
}
static int Number=0;
static int TotalPasses=0;
int Nomer=0;
int Passes=0;
int Delay;

Слайд 14

Коментарі: запуск потоків

potok tr1=new potok(1000);
potok tr2=new potok(2000);
potok tr3=new potok(5000);

Коментарі: запуск потоків potok tr1=new potok(1000); potok tr2=new potok(2000); potok tr3=new potok(5000);

Слайд 15

Використання змінних

Кожний потік отримує власні копії локальних змінних та полів екземпляра, але

Використання змінних Кожний потік отримує власні копії локальних змінних та полів екземпляра,
статичні поля спільно використовуються всіма потоками

Слайд 16

Пріоритети потоків

Потоки можуть виконуватися з різними пріоритетами.
Константи класу Thread: MIN_PRIORITY=1; NORM_PRIORITY=5; MAX_PRIORITY=10
Пріоритет

Пріоритети потоків Потоки можуть виконуватися з різними пріоритетами. Константи класу Thread: MIN_PRIORITY=1;
може бути встановлений методом setPriority, хоча ручне управління пріоритетами не дуже рекомендується.

Слайд 17

Зупинка потоку

Є метод для явної зупинки, але ним користуватися не рекомендується.
Краще -

Зупинка потоку Є метод для явної зупинки, але ним користуватися не рекомендується.
цикл, в якому задати умову завершення потоку.

Слайд 18

Метод interrupt

Запит на переривання потоку.
Встановлює в потоці статус переривання.
Не є примусовим перериванням!

Метод interrupt Запит на переривання потоку. Встановлює в потоці статус переривання. Не
Потік має сам вирішити, як обробляти цей запит!

Слайд 19

Приклад застосування interrupt

Thread t = new MyThread();
t.start();
t.interrupt();
try {
t.join();

Приклад застосування interrupt Thread t = new MyThread(); t.start(); t.interrupt(); try {
}
catch (InterruptedException ir) {
System.out.println("InterruptedException happened");
}
}

Слайд 20

1-й варіант потоку: interrupt не працює

class MyThread extends Thread {
@Override
public

1-й варіант потоку: interrupt не працює class MyThread extends Thread { @Override
void run() {
boolean b=true;
while (b) {
if (isInterrupted()) System.out.println("Request for interruption received");
System.out.println("I am still working!");
}
System.out.println("Thread finished");
}
}

Слайд 21

2-й варіант: потік зупиняється

public void run() {
boolean b=true;
while (b) {

2-й варіант: потік зупиняється public void run() { boolean b=true; while (b)
if (isInterrupted()) {
System.out.println("Request for interruption received");
b=false;
}
System.out.println("I am still working!");
}
System.out.println("Thread finished");
}

Слайд 22

Затримка потоку

Метод sleep().
Або викликається для конкретного потоку, або Thread.sleep(мс);

Затримка потоку Метод sleep(). Або викликається для конкретного потоку, або Thread.sleep(мс);

Слайд 23

Метод join

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

Метод join Дозволяє дочекатися завершення іншого потоку. Наприклад, якщо потік tr1 робить
tr2.join(), то він призупиняється і чекає, поки tr2 не завершить роботу.

Слайд 24

Стани потоків

New – створений, але не запущений.
Runnable – запущений методом start.
Dead –

Стани потоків New – створений, але не запущений. Runnable – запущений методом
зупинений.
Block – заблокований. Переходить до заблокованого стану після методу sleep або wait, або якщо він чекає завершення операції введення-виведення, або якщо він чекає завершення синхронізованого методу.

Слайд 25

Метод yield

Передає управління іншому потоку з тим же пріоритетом.

Метод yield Передає управління іншому потоку з тим же пріоритетом.

Слайд 26

Синхронізація потоків

Проблема полягає в тому, що часто потрібно заборонити одночасний доступ різних

Синхронізація потоків Проблема полягає в тому, що часто потрібно заборонити одночасний доступ
потоків до певних об’єктів або одночасний виклик певних методів.
Основні методи синхронізації – за ресурсами та за подіями.

Слайд 27

Синхронізація за ресурсами

Ключове слово synchronized - у формі оператора та у формі

Синхронізація за ресурсами Ключове слово synchronized - у формі оператора та у формі модифікатора.
модифікатора.

Слайд 28

Оператор synchronized

synchronized (expression) {
statements
}
Вираз expression повертає об’єкт або масив. Перед виконанням критичної

Оператор synchronized synchronized (expression) { statements } Вираз expression повертає об’єкт або
секції (statements) цей об’єкт блокується, і ніякий інший потік не може мати до нього доступу, поки виконується критична секція.

Слайд 29

Приклад: сортування масиву

public static void sortIntArray( int[] a) {

synchronized (a) {
Sorting
}
}

Приклад: сортування масиву public static void sortIntArray( int[] a) { … synchronized

Слайд 30

Synchronized як модифікатор

Якщо модифікатор synchronized використовується в описі методу - весь метод

Synchronized як модифікатор Якщо модифікатор synchronized використовується в описі методу - весь метод оголошується критичною секцією.
оголошується критичною секцією.

Слайд 31

Синхронізовані колекції

Collections.synchronizedList(new ArrayList());
Concurrent API.

Синхронізовані колекції Collections.synchronizedList(new ArrayList()); Concurrent API.
Имя файла: Тема-№11.pptx
Количество просмотров: 95
Количество скачиваний: 0