Многопоточный код
    java.lang.Thread
   java.util.concurrent



                 Андрей Морозов, 2012
Состояния потока

• New – создан, но не запущен
• Running – активно использует ресурс
  CPU
• Blocked, Waiting – ожидает ресурсов
  или событий
• Terminated – поток перестал
  использовать CPU
Свойства потока
• Свойства
  •   Id
  •   Name
  •   Priority
  •   Daemon
• Свойства потока не могут изменяться
  после запуска
Расширение класса Thread

• Наследник класса Thread
  переопределяет метод run()
• Создаётся экземпляр подкласса
• Вызов метода start() данного подкласса
• JVM начинает выполнение потока
  вызовом метода run()
Пример
class SimpleCombat extends Thread {
  public void run(){
     //something
   }
}
//запуск инструкций в новом потоке
new SimpleCombat().start();
Интерфейс java.lang.Runnable

• Интерфейс Runnable реализуется
  классом, который должен выполняться
  в отдельном потоке
• Экземпляр класса должен быть
  передан конструктору класса Thread в
  качестве аргумента
• Запуск потока осуществляется методом
  start() класса Thread
Пример
public class Test implements Runnable {
  private Thread selfThread = null;
    private Test(){
       selfThread = new Thread(this);
       selfThread.start();
   }
   public void run() {
     //something
   }
}
Исполнители (executors)
Import java.util.concurrent.*

public class CachedTreadPool {
  public static void main (String[] args){
     ExecutorServer exec =
  Executors.newCachedTreadPool();
     for (int i = 0; i< 5; i++){
      exec.execute(new Test())
     }
  }
}
Интерфейс Callable
class Task impliments     // Клиентский код
     Callable<String> {   ExecutorService exec =
 private int id;              Executors.newCachedTreadPool
 public Task(int id){         ();
     this.id = id }
 public String call(){    ArrayList<Future<String>>() results
                             = new
    return “Result”+id       ArrayList<Future<String>>()
  }
}                         for (int I = 0; i < 10; i++){
                          results.add(exes.submit(new Task))
                          }
Синхронизация потоков
public class DataManager {
  private static boolean ready = false;

    public void sendData() {
      while (!ready) {
        System.out.println("Waiting for data...");
      }
      System.out.println("Sending data...");
    }

    public void prepareData() {
      ready = true;
    }
}
Cпособы синхронизации потоков
• Использовании атомарных операций и
  переменных.

• Использование классов java.util.concurrent (Lock,
  Semaphore, etc).

• Системная синхронизация с использованием
  wait/notify.

• Системная синхронизация с использованием join
wait() и notify()
public class DataManager {                       public void prepareData() {
  private static final Object monitor =                   synchronized (monitor) {
   new Object();
                                                             System.out.println("Data
  public void sendData() {                               prepared");
          synchronized (monitor) {                            monitor.notifyAll();
              try {                                       }
                  monitor.wait();                    }
              } catch (InterruptedException e)   }
      {
                  e.printStackTrace();
              }
          System.out.println("Sending
      data...");
          }
  }
Монитор
• Передача событий
  – wait(time)
  – notify()
  – notifyAll()
• Нужно владеть блокировкой
  – IllegalMonitorStateException
• Помним про возможность ложного
  пробуждения
join()
class Sleeper extends Thread {                           class Joiner extends Thread {
    private int duration;                                    private Sleeper sleeper;
    public Sleeper(String name, int                          public Joiner(String name, Sleeper
      sleepTime) {                                             sleeper) {
        super(name);                                             super(name);
        duration = sleepTime;                                    this.sleeper = sleeper;
        start();                                                 start();
    }                                                        }
    public void run() {                                      public void run() {
        try {                                                try {
            sleep(duration);                                         sleeper.join();
        } catch(InterruptedException e) {                        } catch(InterruptedException e)
            print(getName()+" was interrupted."+                   { print("Interrupted");
               "isInterrupted(): " + isInterrupted());           }
            return;                                              print(getName() + " join completed");
        }                                                    }
        print(getName() + " has awakened");              }
    }
}
join() cont.
public class Joining {                           Console:
    public static void main(String[] args)       sleeper1 was interrupted.
      {                                              isInterrupted(): false
        Sleeper                                  joiner1 join completed
        sleeper1 = new Sleeper(“sleeper1",       sleeper2 has awakened
        1500),                                   joiner2 join completed
sleeper2 = new Sleeper(“sleeper2",
   1500);
        Joiner
        joiner1 = new Joiner(“joiner1",
        sleepy),
        joiner2 = new Joiner(“joiner2",
        grumpy);
        sleeper1.interrupt();
    }
}
Атомарность операций
• Атомарная операция - это операция,
  которую не может прервать
  планировщик потоков.


• В java se5 появились специальные
  классы для выполнения атомарных
  операций – AtomicInteger, AtomicLong,
  AtomicReference и др.
Пример
import java.util.concurrent.atomic.*;
public class AtomicEvenGenerator extends IntGenerator {


        private AtomicInteger currentEvenValue =
           new AtomicInteger(0);


        public int next() {
           return currentEvenValue.addAndGet(2);
    }
}
AtomicInteger
int get() текущее значение
void set(int newValue) установка нового значения
int incrementAndGet() ++x.
long getAndIncrement() x++.
int addAndGet(int delta) –увеличивает значение на
   delta и возвращает новое значение.
int getAndAdd(int delta) –увеличивает значение на
   delta и возвращает предыдущее значение.
boolean compareAndSet(int expect, int update) –
   установка нового значения если текущее равно
   значению параметра expect.
CAS

Do {
  old = v.get();
  new = process();
} while (v.compareAndSet(old, new))
Synchronized

public class SynchronizationExample {
    private int i;
    public synchronized int synchronizedMethodGet() {
        return i;
}
    public int synchronizedBlockGet() {
        synchronized( this ) {
            return i;
        }
    }
}
Synchronized vs Volatile

synchronized -это гарантия того, что
  только один поток выполняет секцию
  кода в один момент времени

Volatile. Когда переменная объявлена
 как volatile, любая запись её будет
 осуществляться прямо в память, минуя
 кеш.
Volatile
//код не безопасен для потоков:
myVolatileVar++;


//Этот код также может быть записан следующим
   образом:
int temp = 0;
synchronize( myVolatileVar ) {
    temp = myVolatileVar;
}
temp++;
synchronize( myVolatileVar ) {
    myVolatileVar = temp;
}
Объекты Lock
import java.util.concurrent.locks.*;
public class Test {
        private Lock lock = new ReentrantLock();
        public int next() {
          Lock.lock();
          try {
              // do something
          } finally {
                  lock.unlock();
          }
    }
}
Семафоры

private final Semaphore available = new
Semaphore(MAX_AVAILABLE, true);


public Object getItem() throws InterruptedException {
available.acquire();
return getNextAvailableItem();
}
public void putItem(Object x) {
available.release();
}
Семафоры
Конструктор
Semaphore(n, fair?) – число разрешений и
  честность

Методы
acquire(n?) - получить разрешение
release(n?) - отдать разрешение
tryAquire(n?, time?) -попробовать получить
   разрешение
reducePermits(n) – уменьшить количество
   разрешений
drainPermits() – забрать все разрешения
CountDownLatch - Защелка
Возможности:
• стартуем определённое число потоков
 одновременно;
• можно отследить момент окончания
 нескольких потоков.

Методы:
await(time?) – ждем опускания защелки
countDown() – опускаем защелку на еденицу
getCount() – текущая высота защелки
CountDownLatch
public class LThread extends
   Thread {                            // клиентский код
  private final CountDownLatch         CountDownLatch start = new
   start;                                  CountDownLatch(1);
  public LThread(CountDownLatch        for (int N = 0; N < 4; N++) {
   start) {                            Thread t = new LThread(start);
           this.start = start;         t.start();
  }                                    }
  public void run() {                  Thread.sleep(200);
                                       start.countDown();
   System.out.println( “PreRun”);
         try {
                start.await();
} catch (InterruptedException iex) {
        } }}
CountDownLatch
public class SLThread extends   CountDownLatch cdl = new
    Thread {                      CountDownLatch(10);
private final CountDownLatch    for (int i = 0; i < 10; i++) {
    stop;
                                Thread t = new SLThread(cdl);
public
    SLThread(CountDownLatch     t.start();
    stop) {                     }
this.stop = stop;               cdl.await();
}
                                System.out.println(“Stopped”);
public void run() {
try {
// Некоторые действия
} finally {
stop.countDown();
}}}
CyclicBarrier - Барьер

Конструкторы
• CeclicBarrier(n, runnable?) – число
  потоков и действие на барьере
Методы
• await(time?) – барьер
• reset() – возвращает барьер в
  первоначальное состояние
• isBroken() – проверка состояния
  барьера
Exchanger - Обменник
• Позволяет обмениваться объектами
• Конструктор
  – Exchanger()
• Методы
  – exchange(V x, time?) –обменяться
Timer
Timer timer = new Timer();
TimerTask task = new TimerTask() {

  @Override
  public void run() {
    mainActivity();
  }
};
timer.schedule(task,TIMEOUT);
Домашнее задание
• Взять за основу код из ДЗ к первой
  лекции

• Изменить код если требуется

• Добавить возможность записи паролей
  в несколько файлов одновременно
Doc
http://docs.oracle.com/javase/1.5.0/docs/api/
  java/lang/Thread.html

http://docs.oracle.com/javase/6/docs/api/jav
  a/util/concurrent/package-summary.htm

http://jcp.org/en/jsr/detail?id=166

More Related Content

PPTX
Developing highload servers with Java
PDF
Unsafe: to be or to be removed?
PPTX
Multiprocessor Programming Intro (lecture 3)
PDF
JavaScript. Event Loop and Timers (in russian)
PDF
Java tricks for high-load server programming
PPTX
Multithreading in java past and actual
PDF
Практика Lock-free. RealTime-сервер
PDF
Caching data outside Java Heap and using Shared Memory in Java
Developing highload servers with Java
Unsafe: to be or to be removed?
Multiprocessor Programming Intro (lecture 3)
JavaScript. Event Loop and Timers (in russian)
Java tricks for high-load server programming
Multithreading in java past and actual
Практика Lock-free. RealTime-сервер
Caching data outside Java Heap and using Shared Memory in Java

What's hot (20)

PPT
java
PDF
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
PPTX
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
PPTX
Java 8. Thread pools
PDF
Помоги ближнему, или Как потоки помогают друг другу
PDF
RDSDataSource: Promises
PPTX
Java threads - part 2
PDF
Atomics, CAS and Nonblocking algorithms
PPTX
Java threads - part 3
PPTX
Deep Dive C# by Sergey Teplyakov
PDF
Zagursky
PDF
RxJava+RxAndroid (Lecture 20 – rx java)
PPT
10. java lecture generics&collections
PPT
9. java lecture library
PDF
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
PPTX
Async clinic by by Sergey Teplyakov
PDF
How threads help each other
PDF
Java осень 2013 лекция 6
PDF
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
PDF
Быстрое введение в TDD от А до Я
java
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Java 8. Thread pools
Помоги ближнему, или Как потоки помогают друг другу
RDSDataSource: Promises
Java threads - part 2
Atomics, CAS and Nonblocking algorithms
Java threads - part 3
Deep Dive C# by Sergey Teplyakov
Zagursky
RxJava+RxAndroid (Lecture 20 – rx java)
10. java lecture generics&collections
9. java lecture library
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Async clinic by by Sergey Teplyakov
How threads help each other
Java осень 2013 лекция 6
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Быстрое введение в TDD от А до Я
Ad

Viewers also liked (20)

PDF
Webinar: Разработка мобильного приложения для заучивания стихов в Delphi
PDF
Animations (Lecture 17 – animations)
PDF
Database (Lecture 14 – database)
PDF
Системы автоматизированной сборки (Lecture 05 – gradle)
PDF
Введение в Android-разработку (Lecture 06 – basics)
PPTX
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
PPTX
Семантика текста (HTML5 тема 04 - семантика текста)
PDF
Работа с графической подсистемой (Lecture 10 – Graphics)
PPTX
Стилизация текста (HTML5 тема 05 - стилизация текста)
PDF
Seminar: Эффективное использование среды разработки и компилятора C++
PDF
PDF
Webinar: Использование UWP/WinRT Contracts и Notification в Windows 10
PDF
PDF
Работа с соцсетями (Lecture 19 – social)
PDF
Android - 05 - Android basics
PDF
Toolbar (Lecture 16 – toolbar)
PDF
Webinar: Возможности RAD Studio 10 Seattle для разработки Windows 10 приложений
PDF
Seminar: Установка и настройка рабочего стенда разработчика Android-приложени...
PDF
Fragments (Lecture 09 – Fragments)
Webinar: Разработка мобильного приложения для заучивания стихов в Delphi
Animations (Lecture 17 – animations)
Database (Lecture 14 – database)
Системы автоматизированной сборки (Lecture 05 – gradle)
Введение в Android-разработку (Lecture 06 – basics)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Семантика текста (HTML5 тема 04 - семантика текста)
Работа с графической подсистемой (Lecture 10 – Graphics)
Стилизация текста (HTML5 тема 05 - стилизация текста)
Seminar: Эффективное использование среды разработки и компилятора C++
Webinar: Использование UWP/WinRT Contracts и Notification в Windows 10
Работа с соцсетями (Lecture 19 – social)
Android - 05 - Android basics
Toolbar (Lecture 16 – toolbar)
Webinar: Возможности RAD Studio 10 Seattle для разработки Windows 10 приложений
Seminar: Установка и настройка рабочего стенда разработчика Android-приложени...
Fragments (Lecture 09 – Fragments)
Ad

Similar to Thread (20)

PPTX
javaaaaddawdawdawdasdsadsaddadadm11n.pptx
PDF
JPoint 2016 - Etudes of DIY Java profiler
PPT
8. java lecture threads
PPTX
C# Deep Dive
PPTX
C sharp deep dive
PDF
CPU Performance in Java.
PDF
Асинхронный JavaScript
PDF
2012 03 14_parallel_programming_lecture05
PPTX
PPSX
Веселая ферма. Соседи.
PPT
Юнит-тестирование и Google Mock. Влад Лосев, Google
PDF
PPT
Mike ponomarenko java17-fork-v1.2
PDF
PVS-Studio в 2021 - Примеры ошибок
PPTX
Асинхронность и сопрограммы
PDF
JPoint 2015 - Javassist на службе Java-разработчика
PPTX
C#. От основ к эффективному коду
PDF
Java осень 2014 занятие 3
PPT
Исключения и ошибки
PDF
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
javaaaaddawdawdawdasdsadsaddadadm11n.pptx
JPoint 2016 - Etudes of DIY Java profiler
8. java lecture threads
C# Deep Dive
C sharp deep dive
CPU Performance in Java.
Асинхронный JavaScript
2012 03 14_parallel_programming_lecture05
Веселая ферма. Соседи.
Юнит-тестирование и Google Mock. Влад Лосев, Google
Mike ponomarenko java17-fork-v1.2
PVS-Studio в 2021 - Примеры ошибок
Асинхронность и сопрограммы
JPoint 2015 - Javassist на службе Java-разработчика
C#. От основ к эффективному коду
Java осень 2014 занятие 3
Исключения и ошибки
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads

More from Alexander Rusin (11)

PDF
Scala for android
PDF
PDF
PDF
PDF
PDF
PDF
PDF
PDF
PDF
PDF

Thread

  • 1. Многопоточный код java.lang.Thread java.util.concurrent Андрей Морозов, 2012
  • 2. Состояния потока • New – создан, но не запущен • Running – активно использует ресурс CPU • Blocked, Waiting – ожидает ресурсов или событий • Terminated – поток перестал использовать CPU
  • 3. Свойства потока • Свойства • Id • Name • Priority • Daemon • Свойства потока не могут изменяться после запуска
  • 4. Расширение класса Thread • Наследник класса Thread переопределяет метод run() • Создаётся экземпляр подкласса • Вызов метода start() данного подкласса • JVM начинает выполнение потока вызовом метода run()
  • 5. Пример class SimpleCombat extends Thread { public void run(){ //something } } //запуск инструкций в новом потоке new SimpleCombat().start();
  • 6. Интерфейс java.lang.Runnable • Интерфейс Runnable реализуется классом, который должен выполняться в отдельном потоке • Экземпляр класса должен быть передан конструктору класса Thread в качестве аргумента • Запуск потока осуществляется методом start() класса Thread
  • 7. Пример public class Test implements Runnable { private Thread selfThread = null; private Test(){ selfThread = new Thread(this); selfThread.start(); } public void run() { //something } }
  • 8. Исполнители (executors) Import java.util.concurrent.* public class CachedTreadPool { public static void main (String[] args){ ExecutorServer exec = Executors.newCachedTreadPool(); for (int i = 0; i< 5; i++){ exec.execute(new Test()) } } }
  • 9. Интерфейс Callable class Task impliments // Клиентский код Callable<String> { ExecutorService exec = private int id; Executors.newCachedTreadPool public Task(int id){ (); this.id = id } public String call(){ ArrayList<Future<String>>() results = new return “Result”+id ArrayList<Future<String>>() } } for (int I = 0; i < 10; i++){ results.add(exes.submit(new Task)) }
  • 10. Синхронизация потоков public class DataManager { private static boolean ready = false; public void sendData() { while (!ready) { System.out.println("Waiting for data..."); } System.out.println("Sending data..."); } public void prepareData() { ready = true; } }
  • 11. Cпособы синхронизации потоков • Использовании атомарных операций и переменных. • Использование классов java.util.concurrent (Lock, Semaphore, etc). • Системная синхронизация с использованием wait/notify. • Системная синхронизация с использованием join
  • 12. wait() и notify() public class DataManager { public void prepareData() { private static final Object monitor = synchronized (monitor) { new Object(); System.out.println("Data public void sendData() { prepared"); synchronized (monitor) { monitor.notifyAll(); try { } monitor.wait(); } } catch (InterruptedException e) } { e.printStackTrace(); } System.out.println("Sending data..."); } }
  • 13. Монитор • Передача событий – wait(time) – notify() – notifyAll() • Нужно владеть блокировкой – IllegalMonitorStateException • Помним про возможность ложного пробуждения
  • 14. join() class Sleeper extends Thread { class Joiner extends Thread { private int duration; private Sleeper sleeper; public Sleeper(String name, int public Joiner(String name, Sleeper sleepTime) { sleeper) { super(name); super(name); duration = sleepTime; this.sleeper = sleeper; start(); start(); } } public void run() { public void run() { try { try { sleep(duration); sleeper.join(); } catch(InterruptedException e) { } catch(InterruptedException e) print(getName()+" was interrupted."+ { print("Interrupted"); "isInterrupted(): " + isInterrupted()); } return; print(getName() + " join completed"); } } print(getName() + " has awakened"); } } }
  • 15. join() cont. public class Joining { Console: public static void main(String[] args) sleeper1 was interrupted. { isInterrupted(): false Sleeper joiner1 join completed sleeper1 = new Sleeper(“sleeper1", sleeper2 has awakened 1500), joiner2 join completed sleeper2 = new Sleeper(“sleeper2", 1500); Joiner joiner1 = new Joiner(“joiner1", sleepy), joiner2 = new Joiner(“joiner2", grumpy); sleeper1.interrupt(); } }
  • 16. Атомарность операций • Атомарная операция - это операция, которую не может прервать планировщик потоков. • В java se5 появились специальные классы для выполнения атомарных операций – AtomicInteger, AtomicLong, AtomicReference и др.
  • 17. Пример import java.util.concurrent.atomic.*; public class AtomicEvenGenerator extends IntGenerator { private AtomicInteger currentEvenValue = new AtomicInteger(0); public int next() { return currentEvenValue.addAndGet(2); } }
  • 18. AtomicInteger int get() текущее значение void set(int newValue) установка нового значения int incrementAndGet() ++x. long getAndIncrement() x++. int addAndGet(int delta) –увеличивает значение на delta и возвращает новое значение. int getAndAdd(int delta) –увеличивает значение на delta и возвращает предыдущее значение. boolean compareAndSet(int expect, int update) – установка нового значения если текущее равно значению параметра expect.
  • 19. CAS Do { old = v.get(); new = process(); } while (v.compareAndSet(old, new))
  • 20. Synchronized public class SynchronizationExample { private int i; public synchronized int synchronizedMethodGet() { return i; } public int synchronizedBlockGet() { synchronized( this ) { return i; } } }
  • 21. Synchronized vs Volatile synchronized -это гарантия того, что только один поток выполняет секцию кода в один момент времени Volatile. Когда переменная объявлена как volatile, любая запись её будет осуществляться прямо в память, минуя кеш.
  • 22. Volatile //код не безопасен для потоков: myVolatileVar++; //Этот код также может быть записан следующим образом: int temp = 0; synchronize( myVolatileVar ) { temp = myVolatileVar; } temp++; synchronize( myVolatileVar ) { myVolatileVar = temp; }
  • 23. Объекты Lock import java.util.concurrent.locks.*; public class Test { private Lock lock = new ReentrantLock(); public int next() { Lock.lock(); try { // do something } finally { lock.unlock(); } } }
  • 24. Семафоры private final Semaphore available = new Semaphore(MAX_AVAILABLE, true); public Object getItem() throws InterruptedException { available.acquire(); return getNextAvailableItem(); } public void putItem(Object x) { available.release(); }
  • 25. Семафоры Конструктор Semaphore(n, fair?) – число разрешений и честность Методы acquire(n?) - получить разрешение release(n?) - отдать разрешение tryAquire(n?, time?) -попробовать получить разрешение reducePermits(n) – уменьшить количество разрешений drainPermits() – забрать все разрешения
  • 26. CountDownLatch - Защелка Возможности: • стартуем определённое число потоков одновременно; • можно отследить момент окончания нескольких потоков. Методы: await(time?) – ждем опускания защелки countDown() – опускаем защелку на еденицу getCount() – текущая высота защелки
  • 27. CountDownLatch public class LThread extends Thread { // клиентский код private final CountDownLatch CountDownLatch start = new start; CountDownLatch(1); public LThread(CountDownLatch for (int N = 0; N < 4; N++) { start) { Thread t = new LThread(start); this.start = start; t.start(); } } public void run() { Thread.sleep(200); start.countDown(); System.out.println( “PreRun”); try { start.await(); } catch (InterruptedException iex) { } }}
  • 28. CountDownLatch public class SLThread extends CountDownLatch cdl = new Thread { CountDownLatch(10); private final CountDownLatch for (int i = 0; i < 10; i++) { stop; Thread t = new SLThread(cdl); public SLThread(CountDownLatch t.start(); stop) { } this.stop = stop; cdl.await(); } System.out.println(“Stopped”); public void run() { try { // Некоторые действия } finally { stop.countDown(); }}}
  • 29. CyclicBarrier - Барьер Конструкторы • CeclicBarrier(n, runnable?) – число потоков и действие на барьере Методы • await(time?) – барьер • reset() – возвращает барьер в первоначальное состояние • isBroken() – проверка состояния барьера
  • 30. Exchanger - Обменник • Позволяет обмениваться объектами • Конструктор – Exchanger() • Методы – exchange(V x, time?) –обменяться
  • 31. Timer Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { mainActivity(); } }; timer.schedule(task,TIMEOUT);
  • 32. Домашнее задание • Взять за основу код из ДЗ к первой лекции • Изменить код если требуется • Добавить возможность записи паролей в несколько файлов одновременно