android - 03 - multithreading, collections

21
Noveo Summer School Лекция 3. Коллекции, многопоточность.

Upload: noveo

Post on 22-Jun-2015

219 views

Category:

Technology


7 download

TRANSCRIPT

Page 1: Android - 03 - Multithreading, Collections

Noveo Summer School

Лекция 3. Коллекции, многопоточность.

Page 2: Android - 03 - Multithreading, Collections

Коллекции2

Коллекции

Page 3: Android - 03 - Multithreading, Collections

Коллекции3

Списки

Список — упорядоченная последовательность, которая может содержать повторы. Дополняет интерфейс Collection операциями, характерными для линейной структуры (поиск индекса, обращение к элементу по индексу, взятие подсписка).

Page 4: Android - 03 - Multithreading, Collections

Коллекции4

СпискиРеализации в Java

• LinkedList<E> — на основе двусвязного списка, нужно применять, когда много операций вставки в начало или середину списка.

• ArrayList<E> — на основе массива, эффективен при частых обращениях к элементам с произвольным индексом.

• Vector<E> — старая реализация, тот же ArrayList<E>, но потокобезопасный. Почти не используется.

Page 5: Android - 03 - Multithreading, Collections

Коллекции5

Множества

Множество – набор неповторяющихся элементов.• HashSet<E> – множество на основе

Hash-таблицы.• LinkedHashSet<E> – множество на

основе Hash-таблицы и двусвязного списка.

• TreeSet<E> – множество на основе красно-черного дерева (использует Comparable или Comparator).

Page 6: Android - 03 - Multithreading, Collections

Коллекции6

Очереди

Queue<E> и Deque<E> — реализуют однонаправленную и двунаправленную очереди. LinkedList является одной из реализаций.• offer• poll• peek

Page 7: Android - 03 - Multithreading, Collections

Коллекции7

Словари (Maps)

Map – множество пар ключ-значение.• HashMap<K,V> – основана на

Hash-таблице, не может содержать null в качестве ключей или значений.

• TreeMap<K,V> - основана на красно-черном дереве. Log(n) трудоемкость.

• Hashtable<K,V> - устаревшая реализация, использовать НЕ НАДО.

Page 8: Android - 03 - Multithreading, Collections

Коллекции8

Iterator

Iterator – объект, который позволяет последовательно проходить элементы коллекции.

List<String> list = new LinkedList<String>();list.add("first");list.add("second");

Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {

String next = iterator.next();System.out.println(next);

}

Page 9: Android - 03 - Multithreading, Collections

Коллекции9

ListIterator

ListIterator – интерфейса-наследник Iterator, позволяет проходить по элементам списка как в прямом, так и в обратном направлении.

Boolean hasNext();E next();

Boolean hasPrevious();E previous();

Page 10: Android - 03 - Multithreading, Collections

Коллекции10

Collections

Collections – класс, содержащий набор вспомогательных статических методов.Например:sort(List<T> list);swap(List<T>, int I, int j);reverse(List<?> list);fill(List<? super T>, T obj);

Page 11: Android - 03 - Multithreading, Collections

11

МногопоточностьКак запустить код в другом потоке

public class MyRunnable implements Runnable {@Overridepublic void run() {

System.out.println(“Hello World”);}

}

Использование:Thread thread = new Thread(new MyRunnable());thread.start();

Многопоточность

Page 12: Android - 03 - Multithreading, Collections

12

МногопоточностьКак запустить код в другом потоке

public class MyThread extends Thread {@OverridePublic void run() {

System.out.println(“Hello world”);}

};

Использование:Thread thread = new MyThread();thread.start();

Многопоточность

Page 13: Android - 03 - Multithreading, Collections

13

МногопоточностьSleep & interrupt

public class MyRunnable implements Runnable {@Overridepublic void run() {

try {for (int I = 0; I < 10; i++) {

Thread.sleep(2000);System.out.println(“Hello World”);

}} catch(InterruptedException e) {

System.out.println(“Thread has been interrupted”);}

}}

ИспользованиеThread thread = new Thread(new MyRunnable());thread.start();thread.interrupt();

Многопоточность

Page 14: Android - 03 - Multithreading, Collections

14

МногопоточностьJoin

public class MyRunnable implements Runnable {@Overridepublic void run() {

for (int I = 0; I < 10; i++) {System.out.println(“Hello World”);}

}}

Использование:Thread thread = new Thread(new MyRunnable());thread.start();thread.join();

Многопоточность

Page 15: Android - 03 - Multithreading, Collections

15

МногопоточностьПроблема синхронизации

public class Counter {

private int counter = 0;

public void decrement() {counter--;

}

public void increment() {counter++;

}

}Многопоточность

Page 16: Android - 03 - Multithreading, Collections

16

МногопоточностьSynchronized

public class Counter {

private int counter = 0;

public synchronized void decrement() {counter--;

}

public void increment() {synchronized (this) { counter++;}

}

}

Многопоточность

Page 17: Android - 03 - Multithreading, Collections

17

МногопоточностьWait, notify, notifyAll

public class Box {private boolean empty = true;

public synchronized void get() {while(empty) {

try{wait();

} catch(InterruptedException e){}}//do something importantempty = true;notifyAll();

}}

Многопоточность

Page 18: Android - 03 - Multithreading, Collections

18

МногопоточностьWait, notify, notifyAll

…public synchronized void put() {

while(!empty) {try{

wait();} catch(InterruptedException e){}

}//do something importantempty = false;notifyAll();

}

Многопоточность

Page 19: Android - 03 - Multithreading, Collections

19

Многопоточностьjava.util.concurrent

• Lock objects• Executors• Concurrent collections• Atomic variables

Многопоточность

Page 20: Android - 03 - Multithreading, Collections

Материалы20

Материалы

По коллекциям:• Oracle Tutorial:

http://docs.oracle.com/javase/tutorial/collections/index.html

• Just Java: глава 16.

По многопоточности:• Oracle Tutorial:

http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html

• Just Java: главы 13, 14

Page 21: Android - 03 - Multithreading, Collections

Практическое задание21

Практическое задание

Необходимо реализовать классическую задачу потребителей/производителей.

Суть задачи:Существует некоторый буфер, который доступен из двух потоков, буфер может содержать максимум 5 элементов. Один поток (производитель) способен добавлять значения в буфер, другой поток(потребитель) извлекать их из него. Необходимо реализовать такое взаимодействие упомянутых потоков, при котором потребитель будет осуществлять попытку извлечения только в случае, если в буфере есть хотя бы один элемент, а производитель будет записывать значение в буфер, только если в нем менее 5 элементов.