SlideShare a Scribd company logo
1 of 33
Download to read offline
Многопоточный код
    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

What's hot

Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Sigma Software
 
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorProgramming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorFedor Lavrentyev
 
Помоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другуПомоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другуCEE-SEC(R)
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: PromisesRAMBLER&Co
 
Atomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithmsAtomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithmsAlexey Fyodorov
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)Noveo
 
10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collectionsMERA_school
 
9. java lecture library
9. java lecture library9. java lecture library
9. java lecture libraryMERA_school
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 
Async clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAsync clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAlex Tumanoff
 
How threads help each other
How threads help each otherHow threads help each other
How threads help each otherAlexey Fyodorov
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6Technopark
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
Быстрое введение в TDD от А до Я
Быстрое введение в TDD от А до ЯБыстрое введение в TDD от А до Я
Быстрое введение в TDD от А до ЯAndrey Bibichev
 

What's hot (20)

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

Viewers also liked

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

Viewers also liked (20)

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

Similar to Thread

JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerAnton Arhipov
 
8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threadsMERA_school
 
CPU Performance in Java.
CPU Performance in Java.CPU Performance in Java.
CPU Performance in Java.Dzmitry Hil
 
2012 03 14_parallel_programming_lecture05
2012 03 14_parallel_programming_lecture052012 03 14_parallel_programming_lecture05
2012 03 14_parallel_programming_lecture05Computer Science Club
 
Веселая ферма. Соседи.
Веселая ферма. Соседи.Веселая ферма. Соседи.
Веселая ферма. Соседи.Doomer Samoiloff
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Googleyaevents
 
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Alex Tumanoff
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокAndrey Karpov
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 
JPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчикаJPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчикаAnton Arhipov
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному кодуVasiliy Deynega
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3Technopark
 
Исключения и ошибки
Исключения и ошибкиИсключения и ошибки
Исключения и ошибкиUnguryan Vitaliy
 
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsAlexey Paznikov
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)AvitoTech
 

Similar to Thread (20)

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

More from Alexander Rusin (11)

Scala for android
Scala for androidScala for android
Scala for android
 
Lec 15
Lec 15Lec 15
Lec 15
 
Lec 14
Lec 14Lec 14
Lec 14
 
Lec 12
Lec 12Lec 12
Lec 12
 
Lec 11
Lec 11Lec 11
Lec 11
 
Lec 10
Lec 10Lec 10
Lec 10
 
Lec 6
Lec 6Lec 6
Lec 6
 
Lec 5
Lec 5Lec 5
Lec 5
 
Lec 4
Lec 4Lec 4
Lec 4
 
Lec 2
Lec 2Lec 2
Lec 2
 
Lec 1
Lec 1Lec 1
Lec 1
 

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. Домашнее задание • Взять за основу код из ДЗ к первой лекции • Изменить код если требуется • Добавить возможность записи паролей в несколько файлов одновременно
  • 33. 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