java осень 2012 лекция 2
DESCRIPTION
TRANSCRIPT
![Page 1: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/1.jpg)
Углубленное программирование на Java
Лекция 2. «Многопоточность»
Виталий Чибриков
![Page 2: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/2.jpg)
План битвы лекции
abstract class, interface
Object
Thread, Runnable Iterable, Collections
Generics
Thread-Safe Collections
Message System
![Page 3: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/3.jpg)
Наследование в Java
public abstract class MyAbstractClass {private int a = 0;
public int getSum(){return a + getB();
}
protected int getA(){return a;
}
abstract int getB();}
public interface MyInterface {int getDif();
}
![Page 4: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/4.jpg)
Наследование в Java
public class MyClass extends MyAbstractClass implements MyInterface {private int b = 1;
public int getB(){return b;
}
public int getDif(){return getA() - b;
}}
public class MyClassChild extends MyClass implements Interface1, Interface2{…
}
![Page 5: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/5.jpg)
Наследование в Java
public static void main(String[] args) {//MyAbstractClass aObject = new MyAbstractClass(); - ошибка
MyClass object1 = new MyClass();int result1 = object1.getSum(); int result2 = object1.getDif(); doSomething(object1);
MyInterface object2 = new MyClass();//int result3 = object2.getSum(); - ошибка int result4 = object2.getDif();doSomething(object2);
}
public static void doSomething(MyInterface object){//MyClass object3 = object; - ошибка//int result5 = object.getSum(); - ошибка int result6 = object.getDif();
}
![Page 6: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/6.jpg)
План лекции
abstract class, interface
Object
Thread, Runnable Iterable, Collections
Generics
Thread-Safe Collections
Message System
![Page 7: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/7.jpg)
java.lang.Class
Class – объект, который представляет в runtime данные о классе объекта
static Class<T> forName(String className)
String getCanonicalName()
Fields[] getField(String name)
Class[] getInterfaces()
Method[] getMethods()
Constructor[] getConstructors()
Основные методы класса Class
![Page 8: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/8.jpg)
class Object
public Class<?> getClass()
class Object - класс от которого унаследованны все остальные классы
void myFunction(Object varName) – может обработать любой объект
public String toString()
class MyClass{…} == class MyClass extends Object{…}
Основные методы класса Object
public boolean equals(Object obj)
public int hashCode()
protected Object clone()
![Page 9: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/9.jpg)
Обертки простых типов
Обертки простых типов:
Примитивные типы:
int, long, double, float, boolean, char, void
мало памяти
простая структура
Stack
Integer, Long, Double, Float, Boolean, Character, Void
наследники от Object
сложные типы
Heap
![Page 10: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/10.jpg)
План лекции
abstract class, interface
Object
Thread, Runnable Iterable, Collections
Generics
Thread-Safe Collections
Message System
![Page 11: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/11.jpg)
generics (templates)
Generic programming – аглоритмы для типов, которые будут указыны позже
N алгоритмов, M типов данных. N * M реализаций?
Алгоритмы работают с шаблонами => N + M реализаций
Универсальные алгоритмы:
Примеры:
List<String> students = new ArrayList<String>();
Map<Integer, String> indexToName = new HashMap<Integer, String>();
void printCollection(List<Integer> collection){…};
void printCollection(List<?> collection) {…};
void drawShape(List<Shape> shapes) {…};
void drawShape(List<? extends Shape> shapes) {…};
![Page 12: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/12.jpg)
generics (templates)
Типизация значений
List students == List<Object> students
public Object getFirstValue(List listOfNumbers){return listOfNumbers.get(0);
}
public String getFirstStringValue(List<String> listOfNumbers){return listOfNumbers.get(0);
}
public static void main(String[] args){List<Integer> listOfNumbers = new ArrayList<Integer>();listOfNumbers.add(42);String name1 = (String)getFirstValue(listOfNumbers);
//Runtime error!String name2 = getFirstStringValue(listOfNumbers); //Compile
error!}
![Page 13: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/13.jpg)
generics (templates)
Создание собственных шаблонных типов
public class GenericExample<T> { private T value;
public GenericExample(T value){this.value = value;
} public T getT(){
return value; } public static void main(String[] args) {
GenericExample<Integer> intObject = new GenericExample<Integer>(1);Integer valueInteger = intObject.getT();GenericExample<String> stringObject = new GenericExample<String>("word");String valueString = stringObject.getT();
}}
![Page 14: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/14.jpg)
class LongId
public class LongId<T> { private long id;
public LongId(long id){this.id = id;
}
public long getLong(){return id;
}}
public void manyIdsInParams(long userId, long serverId, long adress){…}
public void manyIdsInParams(LongId<User> userId, LongId<Server> serverId, LongId<Adress> adress){…}
![Page 15: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/15.jpg)
План лекции
abstract class, interface
Object
Thread, Runnable Iterable, Collections
Generics
Thread-Safe Collections
Message System
![Page 16: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/16.jpg)
Iterator & Iterable
Iterator<T> iterator()
boolean hasNext()
void remove()
Object next()
interface Iterable<T>
interface Iterator<T>
![Page 17: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/17.jpg)
Иерархия контейнеров
![Page 18: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/18.jpg)
Collection
implements Iterable
add(T object)
addAll(Collection<T> coll)
clear()
Методы:
contains()
remove(Object o)
removeAll(Collection<T> coll)
size()
isEmpty()
![Page 19: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/19.jpg)
List, Set, Queue
Список с очередностью
LinkedList – быстрое удаление и добавление элементов
ArrayList – быстрый доступ по индексу
List:
Без очередности
Без индекса
Быстрый поиск элемента
Set:
Queue:Очередь
![Page 20: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/20.jpg)
Map
Быстрый поиск по ключу – get(key)
Объект в качестве value. Например другой контейнер (Map<int, List<T>>)
Set<keyType> keySet()
Map<key, value>
Collection<valueType> values()
![Page 21: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/21.jpg)
class Collections
Collections – набор статических методов для работы с контейнерами
Object max(Collection coll)
void copy (List dest, List src)
Основные методы:
Object min(Collection coll)
void reverse(List list)
void shuffle(List list)
void sort(List list)
void swap(List list, int i, int j)
![Page 22: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/22.jpg)
План лекции
abstract class, interface
Object
Thread, Runnable Iterable, Collections
Generics
Thread-Safe Collections
Message System
![Page 23: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/23.jpg)
Processes and Threads
«Живут» в одном процессе
Приложение со своим набором run-time ресурсов и собственной памятью
Старт приложения – создание main потока
Процессы
Потоки
Взаимодействие через Inter Process Communication ресурсы
Можно запускать на нескольких компьютерах
Используют общую память (heap) и другие ресурсы приложения
Потоки могут порождать другие потоки и взаимодействовать с ними
![Page 24: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/24.jpg)
interface Runnable
Всего один метод – run()
Runnable
Поток это объект, реазизующий интерфейс Runnable
public class HelloRunnable implements Runnable {
public void run() { System.out.println("Hello from a thread!");
}
public static void main(String args[]) { (new Thread(new HelloRunnable())).start();
} }
![Page 25: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/25.jpg)
class Thread
Thread содержит метод start() – запуск нового потока
class MyThread extends Thread
сlass Thread реазизует интерфейс Runnable
public class HelloThread extends Thread {
public void run() { System.out.println("Hello from a thread!");
}
public static void main(String args[]) { (new HelloThread()).start();
} }
![Page 26: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/26.jpg)
Runnable vs Thread
Runnable класс нужно передавать в конструктор Thread объекта
Runnable
Можно наследовать класс отличный от Thread
Thread
Содержит методы управления потоком
Thread thread = Thread.currentThread();
Текущий Thread object можно получить в любом месте кода
![Page 27: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/27.jpg)
sleep and interrupt
Если нужно остановить выполнение потока
Thread.sleep(1000) – остановит выполнение потока на 1 секундуЕсли нужно прервать выполнение потока
thread.interrupt() – пошлет прерывание потоку thread
try { Thread.sleep(5000); } catch (InterruptedException e) { // We've been interrupted. return; }
for (int i = 0; i < inputs.length; i++) { heavyTask(inputs[i]); if (Thread.interrupted()) { // We've been interrupted. return; } }
![Page 28: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/28.jpg)
join
Текущий поток ждет пока завершиться поток thread
Если надо остановить текущий поток до окончания другого потока
В текущем потоке вызываем thread.join().
public class HelloThread extends Thread { public void run() {
System.out.println("Hello from a thread!"); } public static void main(String args[]) {
Thread thread = new HelloThread();thread.start(); thread.join();System.out.println("Hello from the main!");
} }
![Page 29: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/29.jpg)
Synchronization
Как осуществить взаимодействие между потоками?
public class HelloThread extends Thread { private StringBuilder builder;
public HelloThread(StringBuilder builder){this.builder = builder;
}
public void run() { builder.append("Hello from a thread!");
}
public static void main(String args[]) {StringBuilder builder = new StringBuilder();Thread thread = new HelloThread();thread.start();
builder.append("Hello from the main!"); }
}
![Page 30: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/30.jpg)
Synchronization
Возможные ошибки одновременного доступа
Thread Interference – потеря результата
Memory Consistency Errors – ошибочное состояние общей памяти
Synchronized methods
Synchronized statements
public synchronized void increment() { j++;
}
public void addName(String name) { synchronized(lockObject) {
lastName = name; nameCount++;
} nameList.add(name);
}
![Page 31: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/31.jpg)
Monitor
public class TwoMonitors { private long c1 = 0; private long c2 = 0; private Object lock1 = new Object(); private Object lock2 = new Object();
public void c1Up() { synchronized(lock1) {
c1++; }
}
public void c2Up() { synchronized(lock2) {
c2++; }
} }
![Page 32: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/32.jpg)
Deadlock
public void c1c2Up() { synchronized(lock1) {
c1++; synchronized(lock2) {
c2++; }
} }
public void c2c1Up() { synchronized(lock2) {
c2++; synchronized(lock1) {
c1++; }
} }
![Page 33: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/33.jpg)
Служба в отдельном потоке
private boolean needDoSomething;
public void run() {while(true){
if(needDoSomething){doSomething();
}Thread.sleep(1000);
}}
![Page 34: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/34.jpg)
wait() and notify()
wait(), notify() и notifyAll() – методы класса Object
object.wait() – ждать в текущем потоке, пока не придет notify()
object.notify() – сигнал «продолжить» первому кто начал wait()
object.notify() – сигнал «продолжить» всем кто начал wait()
![Page 35: Java осень 2012 лекция 2](https://reader035.vdocuments.site/reader035/viewer/2022062319/5538ec814a795971788b4854/html5/thumbnails/35.jpg)
План лекции
abstract class, interface
Object
Thread, Runnable Iterable, Collections
Generics
Thread-Safe Collections
Message System