Тема №11


Потоки (threads)
Базові поняття
   Потоки (threads) - підтримка
    багатопоточності на рівні самої
    мови.
   В одній програмі можна з...
Деякі застосування
   “Чутливі” графічні застосування:
    в одному потоці виконується анімація
    та інші операції, а в...
Потоки: основи
   Кожний потік є екземпляром класу
    Thread.
   Функціональність потоку
    визначається методом run()...
Організація потоків: два
способи
   створення екземпляру класу,
    похідного від класу Thread;
   реалізація інтерфейсу...
Приклад запуску потоку
Thread t = new Thread (new Runnable(){
        public void run() {
            for (int i=0;i<1000;...
Більш простий запуск (якщо
достатньо анонімного потоку)
new Thread () {

      @Override
      public void run() {
       ...
Клас, похідний від Thread
   Основна функціональність потоку визначається в
    методі run().
   Щоб запустити потік, по...
Реалізація інтерфейсу
Runnable
  Наприклад, якщо клас уже є підкласом деякого
   іншого класу.
 Функціональність визнача...
Приклад програми з
кількома потоками
   Програма demopotok в каталозі threads.
   Створюються три потоки; вони реалізуют...
Коментарі: функціональність
потоку
public void run() {
while (Passes<MaxPasses) {
Passes++;
TotalPasses++;
System.out.prin...
Коментарі: конструктор
public potok(int Delay) {
this.Delay=Delay;
this.start();
Number++;
Nomer=Number;
System.out.printl...
Коментарі: початкова
ініціалізація
static int MaxPasses;
static {System.out.println(quot;Enter amounts of passesquot;);
tr...
Коментарі: запуск потоків
potok tr1=new potok(1000);
potok tr2=new potok(2000);
potok tr3=new potok(5000);
Використання змінних
   Кожний потік отримує власні копії
    локальних змінних та полів
    екземпляра, але статичні пол...
Пріоритети потоків
   Потоки можуть виконуватися з різними
    пріоритетами.
   Константи класу Thread:
    MIN_PRIORITY...
Зупинка потоку
   Є метод для явної зупинки, але ним
    користуватися не рекомендується.
   Краще - цикл, в якому задат...
Метод interrupt
   Запит на переривання потоку.
   Встановлює в потоці статус
    переривання.
   Не є примусовим перер...
Приклад застосування
interrupt
Thread t = new MyThread();
     t.start();
     t.interrupt();
     try {
     t.join();
  ...
1-й варіант потоку: interrupt
не працює
class MyThread extends Thread {
   @Override
   public void run() {
      boolean ...
2-й варіант: потік
зупиняється
public void run() {
      boolean b=true;
     while (b) {
        if (isInterrupted()) {
 ...
Затримка потоку
   Метод sleep().
   Або викликається для конкретного
    потоку, або Thread.sleep(мс);
Метод join
   Дозволяє дочекатися завершення
    іншого потоку. Наприклад, якщо потік
    tr1 робить виклик tr2.join(), т...
Стани потоків
   New – створений, але не запущений.
   Runnable – запущений методом start.
   Dead – зупинений.
   Blo...
Метод yield
   Передає управління іншому потоку з
    тим же пріоритетом.
Синхронізація потоків
   Проблема полягає в тому, що часто
    потрібно заборонити одночасний
    доступ різних потоків д...
Синхронізація за ресурсами
   Ключове слово synchronized - у
    формі оператора та у формі
    модифікатора.
Оператор synchronized
synchronized (expression) {
statements
}
Вираз expression повертає об’єкт або масив.
   Перед викона...
Приклад: сортування масиву
public static void sortIntArray( int[] a) {
…
synchronized (a) {
Sorting
}

}
Synchronized як модифікатор
   Якщо модифікатор synchronized
    використовується в описі методу -
    весь метод оголошу...
Синхронізовані колекції
   Collections.synchronizedList(new
    ArrayList());
   Concurrent API.
Координація потоків: ще
один спосіб
   Методи wait() і notify() класу Object. Ідея - потрібно, щоб
    потік призупинився...
Upcoming SlideShare
Loading in...5
×

Thread

618

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
618
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Thread

  1. 1. Тема №11 Потоки (threads)
  2. 2. Базові поняття  Потоки (threads) - підтримка багатопоточності на рівні самої мови.  В одній програмі можна запустити декілька потоків, які будуть працювати паралельно.
  3. 3. Деякі застосування  “Чутливі” графічні застосування: в одному потоці виконується анімація та інші операції, а в іншому – кнопка для зупинки та інші елементи керування.  Сокети.
  4. 4. Потоки: основи  Кожний потік є екземпляром класу Thread.  Функціональність потоку визначається методом run(). Потік завершується, коли завершується виконання коду цього методу (або виникає неперехоплене виключення).  Запуск потоку здійснюється методом start().
  5. 5. Організація потоків: два способи  створення екземпляру класу, похідного від класу Thread;  реалізація інтерфейсу Runnable; досить типовим є використання анонімних класів.
  6. 6. Приклад запуску потоку Thread t = new Thread (new Runnable(){ public void run() { for (int i=0;i<1000;i++) { result+=Math.random()-0.5; } } }); t.start(); //Запуск потоку … t.join(); //Без цього виведення може бути некоректним System.out.println(“Result is quot;+result);
  7. 7. Більш простий запуск (якщо достатньо анонімного потоку) new Thread () { @Override public void run() { for (int i=0;i<1000;i++) { result+=Math.random()-0.5; } System.out.println(quot;Test indicator is quot;+result); } }.start();
  8. 8. Клас, похідний від Thread  Основна функціональність потоку визначається в методі run().  Щоб запустити потік, потрібно викликати метод start(), який викликає run().  Самого лише створення екземпляру недостатньо для запуску потоку.  Якщо просто викликати run() - потік не запускається.  Часто start() викликається в конструкторі, і тоді потік запускається при створенні екземпляра.
  9. 9. Реалізація інтерфейсу Runnable  Наприклад, якщо клас уже є підкласом деякого іншого класу.  Функціональність визначається методом run().  Типова схема запуску потоку: створюється екземпляр класу Thread, конструктору якого передається вказівник на екземпляр нашого класу. Далі викликається start().  Знову-ж таки - часто в конструкторі, і тоді: Thread tr = new Thread(this); tr.start();  Досить типово – як анонімний клас.
  10. 10. Приклад програми з кількома потоками  Програма demopotok в каталозі threads.  Створюються три потоки; вони реалізують той самий код, але роблять різні затримки, і тому працюють з різними швидкостями.  Кожний потік видає повідомлення про поточні значення змінних.  Кожний потік зупиняється після заданої кількості проходів.
  11. 11. Коментарі: функціональність потоку public void run() { while (Passes<MaxPasses) { Passes++; TotalPasses++; System.out.println(Passes+quot;-th pass of thread number quot;+Nomer+quot;; total passes - quot;+TotalPasses); try {sleep(Delay); } catch (InterruptedException e) { System.out.println(quot;Something strange...quot;); }} System.out.println (quot;Thread number quot;+Nomer+quot; stoppedquot;); }
  12. 12. Коментарі: конструктор public potok(int Delay) { this.Delay=Delay; this.start(); Number++; Nomer=Number; System.out.println(quot;Thread number quot;+Nomer+ quot; startedquot;); }
  13. 13. Коментарі: початкова ініціалізація static int MaxPasses; static {System.out.println(quot;Enter amounts of passesquot;); try {BufferedReader br=new BufferedReader( 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. 14. Коментарі: запуск потоків potok tr1=new potok(1000); potok tr2=new potok(2000); potok tr3=new potok(5000);
  15. 15. Використання змінних  Кожний потік отримує власні копії локальних змінних та полів екземпляра, але статичні поля спільно використовуються всіма потоками
  16. 16. Пріоритети потоків  Потоки можуть виконуватися з різними пріоритетами.  Константи класу Thread: MIN_PRIORITY=1; NORM_PRIORITY=5; MAX_PRIORITY=10  Пріоритет може бути встановлений методом setPriority, хоча ручне управління пріоритетами не дуже рекомендується.
  17. 17. Зупинка потоку  Є метод для явної зупинки, але ним користуватися не рекомендується.  Краще - цикл, в якому задати умову завершення потоку.
  18. 18. Метод interrupt  Запит на переривання потоку.  Встановлює в потоці статус переривання.  Не є примусовим перериванням! Потік має сам вирішити, як обробляти цей запит!
  19. 19. Приклад застосування interrupt Thread t = new MyThread(); t.start(); t.interrupt(); try { t.join(); } catch (InterruptedException ir) { System.out.println(quot;InterruptedException happenedquot;); } }
  20. 20. 1-й варіант потоку: interrupt не працює class MyThread extends Thread { @Override public void run() { boolean b=true; while (b) { if (isInterrupted()) System.out.println(quot;Request for interruption receivedquot;); System.out.println(quot;I am still working!quot;); } System.out.println(quot;Thread finishedquot;); } }
  21. 21. 2-й варіант: потік зупиняється public void run() { boolean b=true; while (b) { if (isInterrupted()) { System.out.println(quot;Request for interruption receivedquot;); b=false; } System.out.println(quot;I am still working!quot;); } System.out.println(quot;Thread finishedquot;); }
  22. 22. Затримка потоку  Метод sleep().  Або викликається для конкретного потоку, або Thread.sleep(мс);
  23. 23. Метод join  Дозволяє дочекатися завершення іншого потоку. Наприклад, якщо потік tr1 робить виклик tr2.join(), то він призупиняється і чекає, поки tr2 не завершить роботу.
  24. 24. Стани потоків  New – створений, але не запущений.  Runnable – запущений методом start.  Dead – зупинений.  Block – заблокований. Переходить до заблокованого стану після методу sleep або wait, або якщо він чекає завершення операції введення-виведення, або якщо він чекає завершення синхронізованого методу.
  25. 25. Метод yield  Передає управління іншому потоку з тим же пріоритетом.
  26. 26. Синхронізація потоків  Проблема полягає в тому, що часто потрібно заборонити одночасний доступ різних потоків до певних об’єктів або одночасний виклик певних методів.  Основні методи синхронізації – за ресурсами та за подіями.
  27. 27. Синхронізація за ресурсами  Ключове слово synchronized - у формі оператора та у формі модифікатора.
  28. 28. Оператор synchronized synchronized (expression) { statements } Вираз expression повертає об’єкт або масив. Перед виконанням критичної секції (statements) цей об’єкт блокується, і ніякий інший потік не може мати до нього доступу, поки виконується критична секція.
  29. 29. Приклад: сортування масиву public static void sortIntArray( int[] a) { … synchronized (a) { Sorting } }
  30. 30. Synchronized як модифікатор  Якщо модифікатор synchronized використовується в описі методу - весь метод оголошується критичною секцією.
  31. 31. Синхронізовані колекції  Collections.synchronizedList(new ArrayList());  Concurrent API.
  32. 32. Координація потоків: ще один спосіб  Методи wait() і notify() класу Object. Ідея - потрібно, щоб потік призупинився і дочекався настання певної події. Якщо потік при роботі з об’єктом викликає метод wait(), він зупиняється і чекає, поки не буде викликаний метод notify() цього ж об’єкта.
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×