36
Углубленное программирование на Java Лекция 2. «Многопоточность» Виталий Чибриков

Java осень 2012 лекция 2

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Java осень 2012 лекция 2

Углубленное программирование на Java

Лекция 2. «Многопоточность»

Виталий Чибриков

Page 2: Java осень 2012 лекция 2

План битвы лекции

abstract class, interface

Object

Thread, Runnable Iterable, Collections

Generics

Thread-Safe Collections

Message System

Page 3: Java осень 2012 лекция 2

Наследование в 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

Наследование в 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

Наследование в 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

План лекции

abstract class, interface

Object

Thread, Runnable Iterable, Collections

Generics

Thread-Safe Collections

Message System

Page 7: Java осень 2012 лекция 2

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

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

Обертки простых типов

Обертки простых типов:

Примитивные типы:

int, long, double, float, boolean, char, void

мало памяти

простая структура

Stack

Integer, Long, Double, Float, Boolean, Character, Void

наследники от Object

сложные типы

Heap

Page 10: Java осень 2012 лекция 2

План лекции

abstract class, interface

Object

Thread, Runnable Iterable, Collections

Generics

Thread-Safe Collections

Message System

Page 11: Java осень 2012 лекция 2

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

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

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

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

План лекции

abstract class, interface

Object

Thread, Runnable Iterable, Collections

Generics

Thread-Safe Collections

Message System

Page 16: Java осень 2012 лекция 2

Iterator & Iterable

Iterator<T> iterator()

boolean hasNext()

void remove()

Object next()

interface Iterable<T>

interface Iterator<T>

Page 17: Java осень 2012 лекция 2

Иерархия контейнеров

Page 18: Java осень 2012 лекция 2

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

List, Set, Queue

Список с очередностью

LinkedList – быстрое удаление и добавление элементов

ArrayList – быстрый доступ по индексу

List:

Без очередности

Без индекса

Быстрый поиск элемента

Set:

Queue:Очередь

Page 20: Java осень 2012 лекция 2

Map

Быстрый поиск по ключу – get(key)

Объект в качестве value. Например другой контейнер (Map<int, List<T>>)

Set<keyType> keySet()

Map<key, value>

Collection<valueType> values()

Page 21: Java осень 2012 лекция 2

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

План лекции

abstract class, interface

Object

Thread, Runnable Iterable, Collections

Generics

Thread-Safe Collections

Message System

Page 23: Java осень 2012 лекция 2

Processes and Threads

«Живут» в одном процессе

Приложение со своим набором run-time ресурсов и собственной памятью

Старт приложения – создание main потока

Процессы

Потоки

Взаимодействие через Inter Process Communication ресурсы

Можно запускать на нескольких компьютерах

Используют общую память (heap) и другие ресурсы приложения

Потоки могут порождать другие потоки и взаимодействовать с ними

Page 24: Java осень 2012 лекция 2

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

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

Runnable vs Thread

Runnable класс нужно передавать в конструктор Thread объекта

Runnable

Можно наследовать класс отличный от Thread

Thread

Содержит методы управления потоком

Thread thread = Thread.currentThread();

Текущий Thread object можно получить в любом месте кода

Page 27: Java осень 2012 лекция 2

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

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

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

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

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

Deadlock

public void c1c2Up() { synchronized(lock1) {

c1++; synchronized(lock2) {

c2++; }

} }

public void c2c1Up() { synchronized(lock2) {

c2++; synchronized(lock1) {

c1++; }

} }

Page 33: Java осень 2012 лекция 2

Служба в отдельном потоке

private boolean needDoSomething;

public void run() {while(true){

if(needDoSomething){doSomething();

}Thread.sleep(1000);

}}

Page 34: Java осень 2012 лекция 2

wait() and notify()

wait(), notify() и notifyAll() – методы класса Object

object.wait() – ждать в текущем потоке, пока не придет notify()

object.notify() – сигнал «продолжить» первому кто начал wait()

object.notify() – сигнал «продолжить» всем кто начал wait()

Page 35: Java осень 2012 лекция 2

План лекции

abstract class, interface

Object

Thread, Runnable Iterable, Collections

Generics

Thread-Safe Collections

Message System

Page 36: Java осень 2012 лекция 2

Спасибо за вниманиеВиталий Чибриков

[email protected]