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

Preview:

DESCRIPTION

 

Citation preview

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

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

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

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

abstract class, interface

Object

Thread, Runnable Iterable, Collections

Generics

Thread-Safe Collections

Message System

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

}

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

}

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

}

План лекции

abstract class, interface

Object

Thread, Runnable Iterable, Collections

Generics

Thread-Safe Collections

Message System

java.lang.Class

Class – объект, который представляет в runtime данные о классе объекта

static Class<T> forName(String className)

String getCanonicalName()

Fields[] getField(String name)

Class[] getInterfaces()

Method[] getMethods()

Constructor[] getConstructors()

Основные методы класса Class

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()

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

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

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

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

мало памяти

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

Stack

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

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

сложные типы

Heap

План лекции

abstract class, interface

Object

Thread, Runnable Iterable, Collections

Generics

Thread-Safe Collections

Message System

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) {…};

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!}

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();

}}

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){…}

План лекции

abstract class, interface

Object

Thread, Runnable Iterable, Collections

Generics

Thread-Safe Collections

Message System

Iterator & Iterable

Iterator<T> iterator()

boolean hasNext()

void remove()

Object next()

interface Iterable<T>

interface Iterator<T>

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

Collection

implements Iterable

add(T object)

addAll(Collection<T> coll)

clear()

Методы:

contains()

remove(Object o)

removeAll(Collection<T> coll)

size()

isEmpty()

List, Set, Queue

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

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

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

List:

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

Без индекса

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

Set:

Queue:Очередь

Map

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

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

Set<keyType> keySet()

Map<key, value>

Collection<valueType> values()

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)

План лекции

abstract class, interface

Object

Thread, Runnable Iterable, Collections

Generics

Thread-Safe Collections

Message System

Processes and Threads

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

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

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

Процессы

Потоки

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

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

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

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

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();

} }

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();

} }

Runnable vs Thread

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

Runnable

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

Thread

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

Thread thread = Thread.currentThread();

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

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; } }

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!");

} }

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!"); }

}

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);

}

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++; }

} }

Deadlock

public void c1c2Up() { synchronized(lock1) {

c1++; synchronized(lock2) {

c2++; }

} }

public void c2c1Up() { synchronized(lock2) {

c2++; synchronized(lock1) {

c1++; }

} }

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

private boolean needDoSomething;

public void run() {while(true){

if(needDoSomething){doSomething();

}Thread.sleep(1000);

}}

wait() and notify()

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

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

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

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

План лекции

abstract class, interface

Object

Thread, Runnable Iterable, Collections

Generics

Thread-Safe Collections

Message System

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

chibrikov@corp.mail.ru