Java осень 2012 лекция 2
-
Upload
technopark -
Category
Technology
-
view
324 -
download
3
description
Transcript of Java осень 2012 лекция 2
Углубленное программирование на 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
Спасибо за вниманиеВиталий Чибриков